现在的互联网项目大多采用分布式+微服务+服务集群的方式,那么当项目中的websocket采用集群时就会遇到这么一个问题:
给用户页面推送消息的websocket服务未必是与该用户建立websocket连接的服务。
如果在单机情况下,当websocket需要给用户推送消息时,由于用户已经与websocket服务建立连接,消息推送能够成功。
但如果在集群情况下,用户甲向websocket发起连接请求,有多台服务时,只能与一台服务建立连接(以服务A为例),而这些websocket服务都是有可能会给用户甲推送消息,这时候的服务B和C并没有建立连接,所以会有一部分消息推送失败。
我们通过消息组件来处理这个问题,在原来的系统里,由业务模块的服务处理业务逻辑,发生需要推送给用户的数据的时候,发消息给websocket服务,由websocket服务推送消息给用户。
那么,问题的关键就是确保和用户建立连接的websocket服务就是接收到消息的服务,但是由于建立连接的websockt是由注册中心进行负载均衡分配的,接收消息的服务也是无法确定的,这一点并没有什么太好的办法保证。
因此,我们可以换个思路,只要确保对于业务模块发送的消息,所有的websocket服务都能收到消息