我正在nodeJS上创建一个长轮询聊天应用程序,而不使用Socket.io并使用集群进行缩放。
我必须找到一种方法来存储所有长轮询的HTTP请求和响应对象,使其能够跨所有节点集群可用(这样,当接收到针对长轮询请求的消息时,我就可以得到该请求并对其作出响应)。
我尝试使用redis,然而,当我字符串化http请求和响应对象时,我得到了“无法加强循环结构”错误。
也许我是以错误的方式接近它。在这种情况下,我们通常如何在不同的集群中实现lon-轮询?
发布于 2015-08-15 20:24:20
你要求的似乎有点混乱。
在长轮询情况下,客户端发出http请求,该请求被路由到特定的HTTP服务器。如果无法立即获得满足该请求的数据,则该请求将被保存一段较长的时间,并且它最终会超时,然后客户端将发出另一个长轮询请求,或者一些数据将变为可用,并将返回到请求的响应。
因此,您不能通过集中保存请求和响应对象来使其在集群中工作。它们属于特定服务器和特定客户端之间的特定TCP连接。您不能保存它们并将它们用于其他地方,而且它也无助于集群的任何工作。
我认为您在这里遇到的集群问题是,当某个特定客户端确实可以获得某些数据时,您需要知道该客户端有一个当前正在运行的长轮询请求的服务器,这样您就可以指示该特定服务器从该请求返回数据。
通常这样做的方法是,您有某种userID,它代表每个客户端。当任何客户端使用长轮询请求进行连接时,该连接将被分发到您的服务器之一。获取请求的服务器,然后写入userID userA现在连接到server12的中央数据库(通常是redis)。然后,当某些数据可用于userA时,任何代理都可以在redis存储中查找该用户,并查看该用户当前已连接到server12。因此,他们可以指示server12使用当前用于userA的长轮询连接将数据发送到userA。
这只是处理集群的一种策略--还有许多其他的策略,如粘性负载平衡、算法分发、广播分发等。您可以看到一个描述这里的一些计划的答案。
https://stackoverflow.com/questions/32028744
复制相似问题