【发布时间】:2016-05-12 06:16:33
【问题描述】:
我之前在生产中使用 Tornado 在 Nginx 后面,也使用 多个龙卷风实例,但目前使用 Websockets Tornado 中的实现,我无法理解一些事情。
注意: 只用 Tornado 运行 Websockets 不是我的问题,我可以让它工作并且相当容易地在许多项目中使用它, 但全部作为单个 Tornado 实例,有/没有反向代理或 负载均衡器(nginx),两者都工作正常。
话虽如此,我的疑虑在于如何在负载均衡器后面处理多个 tornado 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,这触发了 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 是您要提出的解决方案之一,它应该存储什么才能让实例正常工作强>?
【问题讨论】: