SockJS和meteor:如果负载均衡器不支持粘性会话怎么办?

时间:2014-03-23 18:11:32

标签: meteor load-balancing sockjs

我正在探索Meteor的平衡选项。 This文章看起来非常酷,并且说应该支持以下内容来平衡Meteor:

  1. Mongo optailing。否则,Meteor的一个实例可能需要长达十秒才能从另一个实例获得更新,因为将使用轮询Mongo驱动程序,每十秒轮询一次并且差异化数据库。
  2. 的WebSocket。它也很清楚 - 否则客户端将回退到HTTP和长轮询,这将起作用,但它不像Websocket那么酷。
  3. SockJS'要求的粘性会话。问题来了:
  4. 据我了解,'粘性会话支持'是在会话期间将一个客户端分配给同一服务器的东西。这是必要的吗?如果我根本不配置粘性会话会发生什么?

    以下是我自己提出的问题:

    1. 因为Meteor将所有发送到客户端的数据存储在内存中,如果客户端连接到X服务器,那么将消耗X倍的内存
    2. 对于相同的用户,例如,不同的标签或窗口,可能会出现一些次要(或主要,如果没有oplog)延迟,这可能会令人惊讶。
    3. 如果SockJS重新连接并希望一些数据在重新连接时保持不变,那么它将会有一段糟糕的时间。我不确定SockJS是如何工作的,这点有效吗?
    4. 会发生什么不好?这三点看起来并不是很糟糕:数据有效,可用,可能需要额外的内存消耗。

1 个答案:

答案 0 :(得分:4)

基本

需要粘性会话以确保服务器可以正确管理内存会话中的浏览器。

首先让我解释为什么你需要粘性会话:

每个使用普通发布游标的发布都会跟踪客户端可能拥有的任何集合,因此当某些内容发生更改时,它会知道要向下发送回客户端的内容。如果需要DDP连接,这将适用于每个Meteor应用程序。这是websockets和sockjs的情况

此外,可能还有其他客户端会话状态存储在变量中,但那些是边缘情况(例如,您将用户的状态存储在变量中)。

当服务器断开连接并重新连接时会出现问题,但不知何故,连接可能会转移到另一个节点(无需重新建立新连接) - 它不知道客户端的数据,所以行为可能会有点奇怪。

SockJS& Sons的问题长轮询

使用SockJS还有一个问题。 SockJS在回退到长轮询时使用websocket仿真。

使用长轮询连接尝试/新http请求时间新数据可用。

如果未启用粘滞会话,则每个连接都将随机分配给不同的节点/发电机。

因此,每次有新数据可用时,您有50%的机会(在其随机情况下)服务器不知道客户端的DDP会话每个

然后它会强制客户端重新协商连接/忽略客户端DDP命令,最终会在客户端上获得非常奇怪的行为。

其中一半将是错误的节点:

enter image description here