背景
在项目中,使用websocket向订阅的客户端推送数据,websocket服务端集群变成多节点后发现客户端有时能收到数据,有时收不到数据。
原因分析
由于websocket服务端是多节点的。每条数据只会由一个节点处理。客户端订阅的时候会订阅其中的一个节点,导致只有订阅处理数据的websocket节点的客户端能收到消息,其他客户端收不到消息。
解决办法
最简单的办法是使用redis的订阅-发布功能,也可以引入消息队列(增加复杂性,不推荐)。每个websocket节点都订阅redis的channel,收到消息后,先发布到redis的channel,然后每个websocket节点都能收到消息,都能推送消息给订阅的客户端。