基于Websocket的消息推送服务
Message push service by websocket.
实现消息实时推送通道。包括以下方面:
-
点对点
向单个客户端推送消息,如按别名推送(用别名来标识一个用户),按客户端标识推送。
常见场景:
- 用户给用户发送站内信 (用户间互动)
- 管理员给单用户发送站内信
- 系统给单用户发送站内信
本方案采用websocket 长连接的方式实现消息通道,使用Kafka消息队列实现消息的存储和分发,ElasticSearch保存消息发送记录。
方案说明:
以上方案主要涉及2部分内容:
- 通过对外提供推送消息报送的API接口,将待推送的业务数据发送到Kafka。
- 由推送服务消费者消费数据,并通过一致性哈希算法找到接受消息的客户端所在的websocket服务,并调用websocket服务的api接口发送消息。
- 同时在消费者中将推送消息持久化到ElasticSearch索引中。
推送相关服务中包括:
-
websocket网关:
- 使用SpringGateway Netty websocket实现, 负责websocket路由,负载,转发)。
- 网关使用一致性哈希算法(基于UID),将同一个用户的websocket连接转发到同一个服务中。
- 监听nacos心跳,检测服务上下线状态,触发Rehash,剔除Rehash客户端(触发客户端重连)。(需考虑哪端维护Rehash状态,并处理websocket断开)
- 一致性哈希数据数据存储在Redis中。
-
websocket接口服务:
- 使用netty实现,负责维持与客户端的连接,并且与客户端进行数据交互。
- 服务需注册到Nacos Server中,需要通过Nacos 感知服务上下线。
- 为消费者提供Http接口, 通过该接口向客户端发送数据。
-
消息消费者:
- 负责消费Kafka的推送消息,并通过Redis中的一致性哈希数据找到对应服务地址,调用websocket接口服务api推送消息。
- Redis: 存储一致性哈希结果。
- Nacos Server: 服务注册中心。
- 一致性哈希的目的:为减少websocket接口服务上下线导致的客户端的重连。
注意点:
- 网关多实例情况下的一致性哈希Rehash处理。
推送平台提供2种类型的接口:
-
消息推送REST API接口
使用Http Basic 认证,为调用方发放appId/appSecret作为调用权限验证。
提供PUSH 推送接口,用于向客户端发送推送消息。
-
客户端websocket 连接服务
提供websocket连接服务,定义websocket通道命令。
- 推送消息接口
curl --location 'https://push.kangspace.org/message-push/v1/push' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic YWFkNTVhNjNjYWRhNDAwNGE5YWZhZDU3YWMwMDlhMTY6ZDlhODZhNzJiY2U3MTVmNw==' \
--data '{
"push_method": 1,
"platform": "all",
"audience": {
"uids": [57098049]
},
"message": {
"title": "title1",
"content": "content1",
"content_type": "content_type1",
"extras": "123extras"
}
}'
wss://push.kangspace.org/message-push/v1/message?Authorization=Bearer pc:ccd75db1e05dd67fd634b6dd9481840e&auth-app-id=DIY4856309478123
查询参数或请求头参数
Query Params/ Http Headers |
value | -- |
---|---|---|
Authorization | Bearer mobile:a939d574dfa281e0a9f886d4499fbc7c Bearer pc:ccd75db1e05dd67fd634b6dd9481840e |
|
auth-app-id | DIY4856309478123 | -- |
测试时间: 2021-11-25
单Pod最高值: 2.5W Websocket连接 JVM 堆内存: 2G