如何坚持Redis的

如何坚持Redis的

问题描述:

我创造的一个的NodeJS长轮询的聊天应用程序的HTTP响应不使用Socket.io和使用群集进行缩放。如何坚持Redis的

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

我一直在使用Redis的尝试,但是,当我字符串化的HTTP请求和响应对象,我得到“无法字符串化的环状结构”错误。

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

+0

我很好奇,为什么“不使用Socket.io?” – mscdex

+0

这是公司给我的问题的一部分。我忍不住:) –

你在问什么似乎有点困惑。

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

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

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

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

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

+0

这样做很有意义。你能指导我如何serverX可以指示serverY发送回应。我听说工作人员只能通过主人 –

+0

@SanchitMehta进行交流 - 不同的服务器可以通过多种方式进行交流。如果不需要几行node.js代码,您可以让每个node.js服务器在自定义端口(通常称为控制端口)上使用http服务器进行侦听,然后仅向该服务器发送http请求以告诉它将数据发送给userA。然后您将确保控制端口不对外部开放,以便它只能从防火墙后面的其他服务器使用。 – jfriend00

+0

@ jfriend00-我有4个集群。我可以让他们都听一个端口(比如说8080)。现在,如果clusterA长查询一个请求,并且clusterB获得一条新消息,那么clusterB可以向端口8080上运行的服务器发送一个请求。我的理解是正确的吗? 现在假设clusterB向端口8080发送一个请求,我们如何确保正确的cluster,即clusterA得到这个请求(4个集群也在监听8080)。 –

如果你确定你想存储所有的请求和响应,看看这个问题。 Serializing Cyclic objects

你也可以尝试cycle.js

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