springsession如何对spring的WebSocketSession进行分布式配置?
关注者
17被浏览
10,8474 个回答
这个问题我已经问了一年多了,可是至今没人回答。其实这个问题在我这里已经解决很长一段时间了,近来有些闲散的时间所以就补充一下答案,也算是有始有终。由于实现原因各有差别所以还希望各位大神指教。
其实实现形式类似于spring-session,就是将所有服务实例的websocketsession放入一个内存服务器中,实现共享,唯独不同的是需要一个服务实例之间进行双向通信的协议,在这里我用的是mq。结构很简单,如下图:
1、当用户在某一个服务实例登录并连接websocket时,成功后将其会话信息与状态放入redis。以实现其websocket的session共享。
2、当用户A需要将信息发送给用户B的时候,由于A和B的登录信息,也就是websocketsession不在同一台服务器上,就需要我们上述的结构来实现,具体步骤:应用实例获得A要发送的信息后,判断B不在自己的实例内的session集合中,所以向redis中查找,在redis中查找到到B的websocketsession信息后,获得其的登录的服务实例的地址,通过MQ向这个地址发送信息,这个地址上的应用实例接收到信息以后将信息推送给B实现一次信息的完整发送。
3、存在问题,这样的结构会存在一下问题,比如过于依赖redis,会导致redis压力过大。再如需要复杂的代码和轮训机制,保证redis中的websocketsession和各个服务实例上的相同。
具体实现大体就是这样,以后我会把代码整理了,去掉业务逻辑保留结构逻辑发上来,一起讨论。