项目引入WebSocket-集群场景
最近站点上了WebSocket,紧接面临的问题是Web服务集群下WS的通讯问题。Web服务多实例的情况下,假如A用户访问订阅了A服务的WS频道,但是B服务在后台发起了广播,实际上A用户是收不到消息的。于是问题来了,集群场景下,广播,单个用户准确发消息呢。
Tech Stack
首先,介绍下当前项目的技术栈
- React
v16.4.2
- SpringBoot
v2.1.6.RELEASE
解决方案
Redis实现用户信息共享,同时Redis实现消息订阅广播即可。
具体代码如何写呢?不啰嗦,戳这里
大致流程
- 用户访问连接WS,redis存储用户信息,集群实例都连接了redis,所以理论上都可以拿到所有用户信息
- 假如要点对点发送消息,唤起redis广播,所有实例redis服务都会收到消息,根据目标UID去找,满足即可发送
- 假如要广播,唤起redis广播,所有实例redis服务都会收到消息,进而都会发送消息,这样所有用户都会收到了。
是否有必要增加Kafka,MQ
网上搜索websocket集群方案,很多都聊到了增加消息队列。当前我在项目中并没有用到,个人认为,假如用量不大,Redis足矣。
写在最后
其实想想,假如没有集群,也就谈不上有这个问题的存在。
那为什么一定要搞集群呢,集群是将服务实例物理增加,以更多的Client提供服务,服务内容相同,但同时却也带来了问题,如文章一开始提到的问题。面对这样的问题,Redis这种NoSQL存储服务暴露给多个Client便就可以解决这个问题。
前因后果大致如此,抛砖引玉。