即时通讯(Instant Messaging)之消息推送
2025-9-17
| 2025-9-19
字数 513阅读时长 2 分钟
type
status
date
slug
summary
tags
category
icon
password
服务端向客户端进行消息推送是在某些系统中常用的功能。为了实现这一功能一般需要以下几个条件:
  • 服务端需要能主动向客户端推送信息
  • 服务端需要能够感知用户的上下线(推送给在线用户,和在线后立即推送)
  • 服务端需要能够精确的向正确的用户推送消息
首先需要选择一个通信协议,这里先讨论最常用的websocket,作为一个全双工协议,能够使客户端和服务端双向通信。这样就解决的上面的第一个点。
接着后面两点其实核心就是如何管理每一个websocket连接。
在java中每一个websocket的session就代表了一个客户端-服务端的websocket连接。可以通过一些回调函数比如(onOpen、onClose)以及websocketSession提供的一些方法来判断客户端是否建立了连接是否关闭了连接。
如何确保能够精确的推送?只要建立起用户id和session的关联,同时需要注意的是如果客户端允许的话,一个用户可能会有多个在线的session。

分布式下的消息推送

在分布式的环境下,不同的session可能存在不同的服务实例中。有可能消息发起者的服务实例中根本没有消息接收者的对应的session。
针对上述问题,对应的解决方法可以有:
  • 维护一个分布式的session中心存储服务,所有的session都放在这里管理。
  • 每个服务只维护自己有的session,后续如果有消息需要推送。通过消息中间件广播这一消息,让所有服务进行消费,如果该服务实例中没有该session则不处理,有则发送。
 
  • 思考
  • IM
  • 分布式
  • 高并发场景下数据库与缓存的一致性0元成本白嫖GPT5一年订阅
    Loading...