我相信您的架构是此类应用的最佳架构之一。
不过,我想提出一些更正。
每个客户端只需要一个套接字来监控他们的在线状态并通过它传输消息。
您必须考虑的重要一点是安全性。您肯定需要 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
您可以使用MPI 或Message Queue 等协议来处理此主干通信。
我想总结一下,您的计划并不是那么容易的任务。我知道可以有一个更简单的实现,但请注意,如果您选择它,在某些时候您不仅可能需要重写所有内容,而且您可能会遇到不稳定问题,这可能会拒绝用户。
最后一条建议:使用现有的最新和最伟大的技术,您可能会比 Facebook 做得更好。
这听起来像是一个大系统和一个模棱两可的项目,所以祝你好运并考虑一切。