负载均衡器背后的龙卷风Websocket实例(Nginx,HaProxy)

时间:2016-05-12 06:16:34

标签: nginx websocket tornado

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

  

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

话虽如此,我怀疑如何处理负载均衡器后面的多个龙卷风websocket实例。让我们看一下 用例

用例: 2个Tornado Websocket实例, T1 T2 落后于Nginx并且有3个客户端(浏览器),让我们说 C1 C2 C3

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

第1步 - C1 w.x.y.z:80 位置启动了websocket连接。现在,Nginx负载平衡连接,让我们说 T1 ,这会在 <中触发 open 事件em> T1(龙卷风) websocket处理程序。现在 T1 知道打开的websocket连接对象,让对象为 w1

第2步 - 现在, C2 启动了一个websocket连接,与上面相同,但现在Nginx已经将它平衡为 {{1} } 触发 T2(龙卷风) websocket处理程序的 T2 事件。现在 T2 知道打开的websocket连接对象,让对象 open

第3步 - 现在,同样 w2 启动了一个websocket连接,Nginx负载均衡为 T1 ,现在已经一个新打开的websocket连接对象,让对象为 C3

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

ws

  

Nginx会将它平衡到T2还是知道它应该代理   对T1本身的请求?

假设它将其发送到 T2 ,现在 T2 没有 Now here is my question. 对象,因为它是使用 T1 ,所以当 T2的 websocket处理程序尝试处理最初应该触发 w1 处理程序的请求时,现在,

  

在这种情况下会发生什么,T2会引发异常还是什么   恰好发生了吗?

     

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

如果我们假设我们使用 on_message 作为解决方案,那么 redis 会实际存储什么? Redis 或者,如果The websocket objects?是您要使用的解决方案之一,它应该存储到什么样才能让实例正常运行建议

1 个答案:

答案 0 :(得分:1)

消息始终附加到连接;它们不是单独负载平衡的。因此在步骤4中,nginx将C1连接上的消息发送到T1,而不是T2。