websocket集群的问题及解决方案

本文讨论了WebSocket在集群环境中遇到的推送消息问题。当用户与特定服务器建立连接时,其他服务器无法直接推送消息。解决方案是利用消息组件(如rabbitmq或kafka),确保所有WebSocket服务都能接收到业务模块的消息。通过服务器IP和端口作为queue名称后缀,保证每个服务的queue独特,从而实现消息的正确分发。这种方法的优点包括解耦代码、支持动态扩展服务节点,但也存在需要为每条消息声明监听器的缺点。为优化,可以创建新的注解以根据beanName匹配和消费queue。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在的互联网项目大多采用分布式+微服务+服务集群的方式,那么当项目中的websocket采用集群时就会遇到这么一个问题:
给用户页面推送消息的websocket服务未必是与该用户建立websocket连接的服务。
websocket服务集群示例

如果在单机情况下,当websocket需要给用户推送消息时,由于用户已经与websocket服务建立连接,消息推送能够成功。
但如果在集群情况下,用户甲向websocket发起连接请求,有多台服务时,只能与一台服务建立连接(以服务A为例),而这些websocket服务都是有可能会给用户甲推送消息,这时候的服务B和C并没有建立连接,所以会有一部分消息推送失败。
我们通过消息组件来处理这个问题,在原来的系统里,由业务模块的服务处理业务逻辑,发生需要推送给用户的数据的时候,发消息给websocket服务,由websocket服务推送消息给用户。
那么,问题的关键就是确保和用户建立连接的websocket服务就是接收到消息的服务,但是由于建立连接的websockt是由注册中心进行负载均衡分配的,接收消息的服务也是无法确定的,这一点并没有什么太好的办法保证。
因此,我们可以换个思路,只要确保对于业务模块发送的消息,所有的websocket服务都能收到消息,只要做到了这一点,与用户建立连接websocket自然也能接收到消息。而且,这种方式相对单台服务收到消息还有一个在处理多点登陆场景下的优势。对于允许多点登录的系统,同一用户可以在多处进行登

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值