[alibaba/tengine]Tengine可以实现websocket的负载均衡吗?

2024-07-12 249 views
5

Tengine可以实现websocket的负载均衡吗?已知nginx的ip_hash可以实现,但是ip_hash会破坏负载均衡, sticky模块的话,因为保持的是一个cookie,我公司的产品是APP,cookie的效果应该不是很好吧,而且nginx的sticky,我看2012年之后就没有更新了,不知道社区大神能指点一下吗?十分感谢

回答

6

websocket 首先发送的是HTTP,然后后续才是websocket帧,对于首个HTTP请求,Tengine选择server块、location块、upstream负载均衡,逻辑和其他的HTTP是一样。
唯一的区别是,客户端->Tengine的连接 以及 Tengine->upstream 的连接 是一一对应的长连接,Tengine不会解析websocket帧,只是将其进行转发。

5

@mrpre 很感谢您的回答,还想再请教您一个问题 现在是不是直接指定了 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; 意思是说将HTTP协议升级为Websocket协议,Nginx/Tengine可以保持住长连接,默认的是60秒,可以通过proxy_read_timeout这个参数去修改这个长连接的时间

0

@xll970211 是的,Tengine会自己保持长连接。

你说的第一次请求去A server,第二次请求去B server的情况存在于HTTP的情况下,Tengine会把客户端的一个TCP连接里面的多个HTTP request(GET/POST等)分别做负载均衡,有可能分发至不同server。

websocket 情况下就不一样了,第一个HTTP请求选定了一台Server后,后续的Websocket帧就会发往这台server。

当然,如果你客户端连接断了然后重新建立了一个websocket连接,那么由于新请求的第一个包还是HTTP的,还会去重新负载均衡选择新Server。

正如你上面写的指令,你可以通过标准的Nginx指令来支持websocket。
其余的就是你需要配合worker_shutdown_timeout指令,否则在你reload后,会出现老进程无法退出的情况(处于is shutting down)。

3

好的,我明白了,十分感谢您的回答,谢谢 @mrpre