springsession如何对spring的WebSocketSession进行分布式配置?

spring-session下如何对spring-websocket的内置的WebSocketSession进行分布式配置,我是使用的spring-w…
关注者
17
被浏览
10,847

4 个回答

这个问题我已经问了一年多了,可是至今没人回答。其实这个问题在我这里已经解决很长一段时间了,近来有些闲散的时间所以就补充一下答案,也算是有始有终。由于实现原因各有差别所以还希望各位大神指教。


其实实现形式类似于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和各个服务实例上的相同。

具体实现大体就是这样,以后我会把代码整理了,去掉业务逻辑保留结构逻辑发上来,一起讨论。

session无法序列化,请问怎么解决的?

为什么?