如何在 Redis 中持久化 HTTP 响应

How to persist HTTP response in redis

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

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

我曾尝试使用 redis,但是,当我对 http 请求和响应对象进行字符串化时,出现 "Cannot Stringify Cyclic Structure" 错误。

也许我的处理方式不对。那么,我们一般如何实现跨集群的lon-polling呢?

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

你也可以试试cycle.js

但是,我认为您只对序列化 request/response 中的少数元素感兴趣。一种更简单(也可能更好)的方法是将所需的 key/value 对从 request/response 对象复制到一个单独的对象中并存储它们。

你问的好像有点乱。

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

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

我认为您在这里遇到的集群问题是,当某些数据确实可用于特定客户端时,您需要知道该客户端的哪个服务器有一个当前处于活动状态的长轮询请求,以便您可以指示特定服务器 return 来自该请求的数据。

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

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