技术饭

负载均衡导致wss的websocket请求被分发到其他服务器,无法实时收到消息

copylian    0 评论    16032 浏览    2021.08.29

负载均衡导致wss的websocket请求被分发到其他服务器,无法实时收到消息,平时我们做swoole即时消息系统的时候,正常情况下就只使用一台服务器作为websocket的请求与分发,但是当加入了负载均衡之后,如果每台服务都开启了websocket,这样会导致客户端的wss请求可能随机分配到不同的服务器上,而每台服务器与客户端链接保存的fd可能重复,A服务器没办法给B服务器的客户端发送消息。

1、如果是单台websocket,那么是没有任何问题的,所有的请求都是同一台服务器,这样保证了fd都是不重复,也同时保证所有的用户websocket都能识别。

2、负载开启websocket服务,如果两台都同时监听9501端口,那么请求可能被分发到A服务器或者是B服务器,如果请求都在同一台服务器自然没问题,但是问题在于:A服务器没法识别B服务器的连接客户端,即使做redis缓存保持了B服务器的fd,A服务器也没办法识别,因为A服务器没有这个fd客户端的连接,除非是A服务器给B服务器发送指令,去执行操作

3、折中解决方案:网上很多人也碰到这个问题,一般就是独立一台单独的websocket服务器这种思维,但是我在想,正常情况下应该是可以有两台甚至N台服务器作为websocket服务器的,只是技术还没到位,暂时也找不到解决方案罢了

4、我的暂时解决方案:通过nginx分发请求给同一台服务器,既然是负载,那我就通过 nginx 的 proxy_pass 分发到同一台服务器上去,这种原理其实也就是一台websocket的思维

#wss2

location /wss2

{

             proxy_pass http://ip:9503;

             proxy_http_version 1.1;

             #proxy_connect_timeout 9990;

             #proxy_send_timeout 9990;

             #proxy_read_timeout 9990;

             proxy_set_header Upgrade $http_upgrade;

             proxy_set_header Connection keep-alive;

             #proxy_set_header Host $host;

             #proxy_cache_bypass $http_upgrade;

             proxy_set_header X-Real-IP $remote_addr;

             #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

             #proxy_set_header x-ssl-enabled true;

             #proxy_set_header X-Nginx-Proxy true;

}

总结:暂时没有找到好的解决方案,如果可以分享给我,谢谢了!

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!

文明上网理性发言!

  • 还没有评论,沙发等你来抢