聊天应用程序的结构和所需的技术
我打算用聊天功能建立网站。 用户将拥有个人资料(例如在社交网络中),并且每个用户都应该能够与另一个用户打开新的聊天室。 我需要能够保存聊天记录,并且我需要知道哪个用户目前在线。
下面是我为这个项目所做的结构图:
我打算有一台运行Apache的服务器来托管我的网站。 它将与运行Socket.io的数据库服务器和Node.js服务器进行通信。 对于当前登录的每个用户,我将创建一个套接字,然后我将通过套接字状态(open / closed)知道谁在线。 对于每个聊天室,我将创建另一个用于发送和接收消息的套接字。 为了保存历史记录,一切都需要通过Node.js服务器。
这种方法是否正确?
是否需要其他技术,以及在两个用户之间创建聊天并将历史记录保存到数据库的最佳方式是什么?
我相信你的架构是这种应用的最佳可能之一。
不过,我想说明一些更正。
每个客户端只需要一个套接字即可监视其在线状态并通过它传输消息。
一些重要的事情你必须考虑的是安全性。 您一定需要SSL证书和加密通信,尤其是对于消息。 因此,您必须非常仔细地考虑如何传输消息,并可能在您的服务器和客户端上使用非对称加密。 (请注意,为了让客户端支持MITM,加密和签名消息的JavaScript必须通过安全连接(HTTPS)进行传输。
XMPP协议是一个好主意(我赞赏@Schwertfisch),但可能并不容易实现。 幸运的是,有些JavaScript库可以实现它,比如Strophe.js,我想这会让事情变得更简单。
你需要考虑的另一件事是你的数据库。 尽管关系模型可以满足这种需求,但如果您拥有更多流量,它肯定会失败。 我建议使用像MongoDB这样的NoSQL数据库引擎,或者可以使用类似PaaS的DynamoDB。
精心设计的NoSQL存储器肯定会提升应用程序的性能。 使用DynamoDB还将放弃糟糕的配置和维护因素。
另外,如果您打算在某个时间点变大,您将不得不使每个应用程序组件都具有可扩展性。 仔细考虑所有类型的缓存,存储数据等,尤其是Node.js服务器。 例如,如果两个用户连接到不同的Node.js实例,则必须创建一个骨干网络来在Node.js实例之间传输消息。
Client A > Chat Server 1 > Chat Server 2 > Client B
您可以使用MPI或Message Queue等协议来处理此主干通信。
我想总结一下,你正在计划的并不是那么容易的事情。 我知道可以有一个更简单的实现,但请注意,如果您选择它,在某个时间点不仅可能需要重写所有内容,还可能会遇到不稳定问题,这可能会拒绝用户。
最后一条建议:使用可用的最新和最伟大的技术,你可能只比Facebook做得更好。
这听起来像一个大系统和一个模糊的项目,所以好运并考虑一切。
有最好的选择。 XMPP协议和您可以使用http://strophe.im/strophejs/库
比我在前面的答案中提出的解决方案更现代和更简单的解决方案是使用Pub / Sub服务和WebSockets。 这种方式的工作原理是,当客户端为您的应用程序建立一个WebSocket时,您将它们订阅到相应的Pub / Sub频道(聊天室),然后将收到的所有消息转发到套接字。 当有人发送消息时,您会将其发布到相应的发布/订阅频道上,然后该服务会将其转发给所有订阅者。
借助这种架构,开发更加简单快捷,您只需填写WebSocket和Pub / Sub服务之间的差距即可。
关于可扩展性,Pub / Sub服务可轻松扩展,您可以简单地扩展应用服务器以处理更多流量。
以下是支持Pub / Sub消息的一些软件和服务的列表:
上一篇: Structure of chat application and required technologies