我正在建立一个项目,主要问题之一是如何实现一个简单的消息队列系统(类似于信使聊天系统的东西)。我想避免轮询,但很可能会有很多并发连接(数万个)。这些将是 HTTP+SSL 连接,从应用程序而不是浏览器开始。
我发现的一个解决方案是 DNS 负载平衡:将这些持久连接分布在一堆 nginx 网络服务器上。
你怎么看?还有其他可能的解决方案吗?
我正在建立一个项目,主要问题之一是如何实现一个简单的消息队列系统(类似于信使聊天系统的东西)。我想避免轮询,但很可能会有很多并发连接(数万个)。这些将是 HTTP+SSL 连接,从应用程序而不是浏览器开始。
我发现的一个解决方案是 DNS 负载平衡:将这些持久连接分布在一堆 nginx 网络服务器上。
你怎么看?还有其他可能的解决方案吗?
对于负载平衡,保持应用程序服务器无状态将显着打开该领域。一旦你有了它,你就可以自由地使用几乎任何通用的负载均衡器。从特定协议(如 HTTP 负载平衡器)到通用 TCP 级负载平衡器。
保持无状态,相比之下,其余的将是微不足道的。
如果您计划使用 Web 服务(XML 消息传递),您可以使用 gsoap,它包含一个使用线程池的 Web 服务器示例应用程序。我已经使用这个和 mysql 运行了一个服务器(用于持久状态)。我同意 Ryan 关于减少/消除应用程序状态的观点。
DNS 负载平衡将允许您在多个 IP 地址(可能是多个服务器)之间分配查询。请记住,您的客户端可能会从一个请求到另一个请求获得不同的服务器,因此您的应用程序不能使用本地状态管理。您的应用程序必须将其状态存储在一个集中的位置,例如数据库。
你考虑过点对点吗?突破防火墙的最新技术实际上非常有效,特别是因为您在每个实例中都运行自己的客户端软件,并且您有服务器来启动连接。
更多的工作,但服务器资源显着减少。
另外,编写自己的服务器软件——确保它可以处理大量连接并且非常轻量级,并且在进行负载平衡之前,您应该能够处理每台服务器的数千个连接。
-亚当