我以前在生产中使用了 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?
是您要使用的解决方案之一,它应该存储到什么样才能让实例正常运行建议?
答案 0 :(得分:1)
消息始终附加到连接;它们不是单独负载平衡的。因此在步骤4中,nginx将C1连接上的消息发送到T1,而不是T2。