如何在redis中保持HTTP响应

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

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

我已经尝试使用redis,但是,当我对http请求和响应对象进行string化时,我得到“无法使string循环结构”错误。

也许我正在以一种错误的方式接近它。 在这种情况下,我们通常如何在不同的集群上实施lon-polling?

你所问的似乎有点困惑。

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

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

我认为你在这里的集群问题是,当一些数据变得可用于特定的客户端时,你需要知道哪个客户端有一个长的轮询请求,当前正在运行,因此你可以指示特定的服务器返回来自该请求的数据。

通常的做法是你有一些代表每个客户端的用户标识。 当任何客户端连接到一个长轮询请求时,该连接将被集群分发到您的一台服务器。 那个获取请求的服务器,然后写入一个中央数据库(通常是redis),这个userID userA现在连接到server12。 然后,当某些数据可用于userA时,任何代理都可以在Redis存储中查找该用户,并查看该用户当前是否连接到server12。 因此,他们可以指示server12使用用户A的当前长轮询连接将数据发送到userA。

这只是一个处理聚类的策略 – 还有很多其他的如粘性负载平衡,algorithm分布,广播分布等等。你可以在这里看到一个描述一些各种scheme的答案。

如果您确定要存储所有请求和响应,请查看此问题。 序列化循环对象

你也可以尝试一下cycle.js

不过,我想你只会对从请求/响应序列化几个元素感兴趣。 一个更容易(也许更好)的方法是将请求/响应对象中所需的键/值对复制到单独的对象中并存储它们。