WebSocket Session共享

最近在做消息中心模块,想要实现消息实时推送到前端页面展示,直接摒弃了前端定时轮训调用接口来获取消息数据的方式,采用了WebSocket服务端推送。

流程是首先前端跟后端应用新建一个连接,并携带当前登录的用户ID,此时WebSocket会创建一个WebsocketSession来唯一绑定该连接,我们会在后端用Map建立用户ID与Session的映射关系:

Map<String userId, WebsocketSession session>

后续有新消息到达时,就可以通过该Map映射找到指定用户ID对应的session来推送消息。但有一个问题,后端是多应用节点,每个节点维护一个这样的Map,无法共享WebsocketSession,而且redis也无法对WebsocketSession序列化后进行存储

由于项目目前用到了Redis,所以可以采用Redis的发布/订阅功能来实现WebsocketSession共享问题。

1.新建一个对象,属性有userId, message,用于发送消息

Object(String userId, String message)

2. 当新消息到达时,将消息注册到redis指定topic的频道上

convertAndSent("topicName", new Object(userId, message))

3.每个应用节点都订阅该topic的频道,这样新消息一注册,每个节点都能接收到Object,然后从Object中获取userId,再从映射Map中获取userId对应的WebsocketSession(在哪个节点建立的连接和Map映射关系,就会在哪个节点找到对应的session),进行消息推送。

就这样通过Redis的发布/订阅功能实现session共享。当然在步骤2,新消息到达时,可以先在本节点的Map映射中查找是否有userId对应的session,如果有,直接推送消息,而且不必要再将消息注册到redis中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,366评论 11 349
  • “公司没了又不会倒,好像我在这里并没有帮到公司什么?” “六点才下班啊,好久啊。” “什么?又开会?老板肯定没有性...
    55c38b021b18阅读 4,907评论 0 0
  • 有人说,在这个光怪陆离的世界里,没有谁能把日子过的行云流水。很多时候我们都倾向于去寻找一份安静,想逃离这个冰冷的城...
    牧心小妖阅读 999评论 0 1
  • 早出晚归,开始想家!20公里的路程,硬生生隔阂了亲情,这样的日子怎么挨下去啊! 每天中午点外卖吃,吃了就无聊地无所...
    美E阅读 170评论 0 0