【发布时间】:2012-01-29 10:57:41
【问题描述】:
我正在考虑编写一些与聊天具有几乎相同要求的 Web 应用程序。而且我希望它们能够轻松扩展。
我使用过 node.js 并了解它如何帮助设计推送应用程序,但在考虑让它们在多个服务器上运行时我遇到了一些困难。
以下是我能想到的大型聊天应用的一些设计:
1 - 服务器有状态,它们保持连接打开,客户端可以将新消息推送给它们。在这种情况下,我们受到一台服务器的物理内存的限制,因此如果每个房间的用户过多,我们就无法线性扩展。
2 - 服务器没有状态,它们请求分布式数据库来响应客户端请求。在这种情况下,客户端轮询服务器。我们可以线性扩展,但吞吐量会降低,消息不会立即传递,并且在扩展时轮询已被证明是一种不好的做法。
3 - 1 和 2 的混合。服务器保持其客户端的连接打开并轮询分布式数据库。该应用程序编写起来更复杂,我们仍然使用轮询。类似客户端的请求(同一个房间的客户端)只是由服务器组合成一个单独的请求。代码变得不必要的复杂,并且在我们有很多房间和每个房间有几个用户的情况下无法扩展。
4 - 服务器没有状态,数据库集群使用事件通知每个注册的服务器有新消息。这是我想要的解决方案,但我还没有听说过任何具有此功能的数据库。 (有些人在这里谈论mongodb的这个功能:https://jira.mongodb.org/browse/SERVER-124)
那么为什么今天没有这么多使用第 4 种解决方案呢?
在这种情况下,人们通常如何设计他们的应用程序?
【问题讨论】: