【问题标题】:Structure of chat application and required technologies聊天应用程序的结构和所需技术
【发布时间】:2014-04-15 06:38:39
【问题描述】:

我打算建立一个具有聊天功能的网站。用户将拥有个人资料(例如在社交网络中),并且他们每个人都应该能够与另一个用户打开一个新的聊天室。我需要能够保存聊天记录,还需要知道哪个用户当前在线。

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      不过,我想提出一些更正。

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

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

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

      您必须考虑的另一件事是您的数据库。虽然关系模型可以很好地满足此目的,但如果您有更多流量,它肯定会让您失败。我建议使用 NoSQL 数据库引擎,例如 MongoDB,或者您可以使用类似 PaaS 的 DynamoDB
      设计良好的 NoSQL 存储肯定会提高应用程序的性能。使用 DynamoDB 也会摒弃糟糕的配置和维护因素。

      此外,如果您计划在某个时间做大,您将不得不使您的每个应用程序组件scalable。仔细考虑各种缓存、存储数据等,尤其是对于 Node.js 服务器。例如,如果两个用户连接到不同的 Node.js 实例,您将不得不建立一个骨干网络来在 Node.js 实例之间传输消息。

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

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

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

      最后一条建议:使用现有的最新和最伟大的技术,您可能会比 Facebook 做得更好。

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

      【讨论】:

      • 真的,这是一个很好的答案!谢谢
      【解决方案3】:

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

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

      关于可扩展性Pub/Sub 服务易于扩展,您可以简单地水平扩展应用程序服务器以处理更多流量。

      这里列出了一些支持Pub/Sub消息传递的软件和服务:

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        相关资源
        最近更新 更多