聊天应用程序的结构和所需的技术

时间:2014-03-11 14:51:42

标签: node.js apache web-applications socket.io chat

我计划使用聊天功能构建网站。用户将拥有配置文件(如在社交网络中),并且每个人都应该能够与另一个用户打开一个新的聊天室。我需要能够保存聊天记录,还需要知道哪个用户当前在线。

下面是我为这个项目制作的结构图:

diagram

我打算让服务器运行 Apache 来托管我的网站。它将与DB服务器和运行 Socket.io Node.js 服务器通信。对于当前登录的每个用户,我将创建一个套接字,我将通过套接字状态(打开/关闭)知道谁在线。对于每个聊天室,我将创建另一个用于发送和接收消息的套接字。为了保存历史记录,需要通过 Node.js 服务器。

这种方法是否正确?
是否需要其他技术以及在两个用户之间创建聊天并将历史记录保存到数据库的最佳方法是什么?

3 个答案:

答案 0 :(得分:5)

我相信您的架构是此类应用程序的最佳选择之一。

我想说几句更正。

每个客户端只需要一个套接字来监控其在线状态并通过它传输消息。

您需要考虑的重要事项是安全性。您肯定需要 SSL 证书和加密通信,尤其是对于消息。因此,您必须非常仔细地考虑如何传输消息,并且可能在服务器和客户端上使用非对称加密。 (请注意,为了使您的客户端MITM具有抗性,加密和签名消息的JavaScript必须通过安全连接传输 - HTTPS)。

XMPP Protocol是一个好主意(我赞扬@Schwertfisch),但可能不容易实现。幸运的是,有一些JavaScript库可以像Strophe.js那样实现它,我想这会让事情更简单。

您需要考虑的另一件事是您的数据库。虽然关系模型可以很好地用于此目的,但如果您拥有更多流量,它肯定会让您失败。我建议使用NoSQLMongoDB数据库引擎,或者您可以使用类似PaaS的DynamoDB。 精心设计的NoSQL存储肯定会提升应用程序的性能。使用DynamoDB还会丢弃不良的配置和维护因素。

此外,如果您计划在某个时间点变大,则必须制作每个应用程序组件scalable。仔细考虑所有类型的缓存,存储数据等,尤其是 Node.js 服务器。如果例如两个用户连接到不同的 Node.js 实例,则必须建立骨干网络以在 Node.js 实例之间传输消息。

Client A > Chat Server 1 > Chat Server 2 > Client B

您可以使用MPIMessage Queue等协议来处理此骨干通信。

我想总结一下,你的计划并不是那么容易的事。我知道可以有一个更简单的实现,但请注意,如果您选择它,在某个时间点,您不仅可能需要重写所有内容,而且您可能会遇到不稳定性问题,这可能会导致用户失望。

最后一条建议:使用最新和最好的技术,你可能只比Facebook做得更好。

这听起来像一个大系统和一个模糊的项目,所以祝你好运并考虑一切。

答案 1 :(得分:2)

有最好的选择。 XMPP Protocol 你可以使用http://strophe.im/strophejs/

答案 2 :(得分:1)

比我之前回答中提出的解决方案更现代,更简单的解决方案是使用Pub/Sub服务和WebSockets。这种方式的工作方式是当客户端为您的应用程序建立WebSocket时,您将其订阅到相应的Pub/Sub频道(聊天室),然后将收到的所有消息转发到套接字。当有人发送消息时,您将其发布到相应的Pub/Sub频道,然后该服务会将其转发给所有订阅者。

使用这种架构,开发更加简单快捷,您只需填补WebSocket和Pub/Sub服务之间的空白。

关于可扩展性Pub/Sub服务可轻松扩展,您只需横向扩展应用程序服务器即可处理更多流量。

以下是支持Pub/Sub消息传递的一些软件和服务的列表: