【问题标题】:Tornado Websocket Instances behind a Load Balancer (Nginx, HaProxy)负载均衡器(Nginx、HaProxy)后面的 Tornado Websocket 实例
【发布时间】:2016-05-12 06:16:33
【问题描述】:

我之前在生产中使用 TornadoNginx 后面,也使用 多个龙卷风实例,但目前使用 Websockets Tornado 中的实现,我无法理解一些事情。

注意: 只用 Tornado 运行 Websockets 不是我的问题,我可以让它工作并且相当容易地在许多项目中使用它, 但全部作为单个 Tornado 实例,有/没有反向代理或 负载均衡器(nginx),两者都工作正常。

话虽如此,我的疑虑在于如何在负载均衡器后面处理多个 tornado websocket 实例。让我们看一个用例

用例: 2 个 Tornado Websocket 实例,T1T2 在 Nginx 后面,并且有 3 个客户端(浏览器),比方说 C1C2C3

                                     ______|-------|      
 C1-----------------|               |      |  T1   |
                    |               |      |_______|       
 C2-----------------|---> Nginx --->|       
                    |               |      |-------| 
 C3-----------------|               |______|  T2   |   
                                           |_______|

第 1 步 - C1w.x.y.z:80 位置发起了一个 websocket 连接。现在 Nginx 对连接进行负载平衡,比如说 T1,这触发了 T1 中的 open 事件( Tornado 的) websocket 处理程序。现在T1知道了一个打开的websocket连接对象,让这个对象是w1

第 2 步 - 现在,C2 发起了一个 websocket 连接,同上,但现在 Nginx laod 将其平衡到 T2 触发了 T2's(Tornado's) websocket 处理程序的 open 事件。现在T2知道了一个打开的websocket连接对象,让这个对象是w2

第 3 步 - 现在,类似地 C3 发起了一个 websocket 连接,Nginx 将其负载平衡到 T1,它现在有一个新的打开websocket连接对象,设对象为w3

第 4 步 - 现在,C1,我们的第一个客户端通过浏览器的 ws.send() 方法发送了一条消息,其中 ws 是浏览器(客户端)端的 websocket 对象,用于在步骤 1 中创建 websocket 连接。因此,当消息到达 Nginx 时,它会将其负载平衡到 T2

Now here is my question.

Nginx 是否将其负载平衡到 T2 或者它是否知道它应该代理 对 T1 本身的请求?

假设它把它发送到 T2,现在 T2 没有 w1 对象,因为它有 T1,所以当 T2 的 websocket 处理程序尝试处理请求时,本来应该触发 on_message 处理程序,所以现在,

在这种情况下会发生什么,T2 是否引发异常或什么 究竟发生了什么?

另外,在这些情况下如何管理 websocket 连接 是在负载均衡器后面运行的多个龙卷风实例如何 解决这个问题

如果假设我们使用 Redis 作为解决方案,那么 redis 实际存储的是什么? The websocket objects? 或者,如果Redis 是您要提出的解决方案之一,它应该存储什么才能让实例正常工作强>?

【问题讨论】:

    标签: nginx websocket tornado


    【解决方案1】:

    消息总是附加到一个连接上;它们没有单独进行负载平衡。所以在第 4 步中,nginx 将 C1 连接上的消息发送到 T1,而不是 T2。

    【讨论】:

    • 这意味着每当我们在 Tornado 中创建一个 WS 连接时,负载平衡就没有用了?因为,假设两个 Torando 实例最初具有由 Nginx 平衡的相同数量的 WS 连接,然后到其中一个 Tornado 实例的大多数(假设全部)WS 连接都关闭了,所以现在,无论何时发送 WS 消息(打开的) ,它们都将被发送到创建这些 WS 连接的 Tornado 实例,因此,我们可以说没有发生负载平衡,并且所有 WS 请求都命中单个实例而没有使用 Nginx 的负载平衡?跨度>
    • 另外,我知道消息附加到一个连接,但是 nginx 是如何知道哪个后端应用服务器发起了哪些连接,或者它是否存储了这些信息?我不确定。
    • 负载平衡仅在创建新连接时发挥作用。它可能会变得不平衡,例如当服务器重新启动时,但从长远来看,它会随着新连接的打开和旧连接的关闭而平滑。 Nginx 在内部跟踪其客户端和后端连接之间的映射。
    • 好的。因此,如果 nginx 跟踪连接,那就太好了。我不知道这件事。我知道如何通过一些添加的模块使 nginx 跟踪粘性会话。如果 nginx 在内部这样做,那么它很好。但我仍然不确定。如果你确定,那么它会减少我的疑虑。
    猜你喜欢
    • 2013-10-12
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多