如何在redis

时间:2015-08-15 19:52:26

标签: node.js express redis socket.io long-polling

我在nodeJS上创建一个长轮询聊天应用程序,而不使用Socket.io并使用集群进行扩展。

我必须找到一种方法来存储所有长轮询的HTTP请求和响应对象,使其在所有节点集群中都可用(这样当收到长轮询请求的消息时,我可以得到那个请求并回复它)

我尝试过使用redis,但是,当我对http请求和响应对象进行字符串化时,我得到了#34;无法对循环结构进行字符串化"错误。

也许我正以错误的方式接近它。在这种情况下,我们如何在不同的集群中实施离子轮询?

2 个答案:

答案 0 :(得分:1)

如果您确定要存储所有请求和响应,请查看此问题。 Serializing Cyclic objects

您也可以尝试cycle.js

但是,我认为您只对序列化请求/响应中的少数元素感兴趣。更简单(可能更好)的方法是将请求/响应对象中所需的键/值对复制到单独的对象并存储它们。

答案 1 :(得分:0)

你问的问题似乎有点困惑。

在长轮询情况下,客户端发出一个路由到特定HTTP服务器的http请求。如果没有满足该请求的数据立即可用,则该请求将在一段延长的时间内保持活动状态,并且它最终将超时,然后客户端将发出另一个长轮询请求或某些数据将变为可用并且响应将是回到了请求。

因此,您不会通过尝试集中保存请求和响应对象来使这项工作成为集群。这些属于特定服务器和特定客户端之间的特定TCP连接。你不能保存它们并在其他地方使用它们,它也不是帮助任何这些工作集群的东西。

我认为您在此处遇到的群集问题是,当某些数据确实可用于特定客户端时,您需要知道该客户端具有当前有效的长轮询请求的服务器,以便您可以指示该特定服务器从该请求返回数据。

执行此操作的常用方法是使用某种代表每个客户端的userID。当任何客户端使用长轮询请求连接时,该连接将集群分发到您的某个服务器。获取请求的服务器然后写入中央数据库(通常是redis),此userID用户A现在连接到server12。然后,当某些数据可供userA使用时,任何代理都可以在redis存储中查找该用户,并看到该用户当前已连接到server12。因此,他们可以指示server12使用当前用户A的长轮询连接将数据发送给userA。

这只是处理群集的一种策略 - 还有许多其他策略,例如粘性负载平衡,算法分配,广播分发等等......您可以看到描述some of the various schemes here的答案。