12_IM即时通讯
2024-05-23 21:35:30 1 举报
IM即时通讯系统架构
作者其他创作
大纲/内容
reconnect
ZK
实时感知
消费
timeline模型(队列)
本地消息暂存(分发系统宕机方案)
Kafka
message
群聊查出群里所有用户,分别给每个用户推送消息,发回kafka
webH5
消息服务
MQ
离线消息处理(接到分发系统消息后,发现客户端断开,将消息离线处理)
connect定时从ZK发现新分发系统
抢红包1、redis保存红包总数量,原子并发减操作2、将减(抢)成功的用户id发送给红包服务
生产/消费
消息路由根据接入系统ID找到对应的接入系统
生产(添加分发系统ID)
SDKAndroid / iOS
【红包】离线消息(1)获取群成员(2)C2G群红包,Collections.shuffle(成员ID)+多线程并发写Redis红包消息
SSO单点登录系统
通知
session 管理
注册临时节点
websocket
connect
持久所有消息低频读取采用 【读扩散】
message转发/推送
离线消息
业务系统
未读通知
群管HTTP协议
获取接入系统可用节点
1、消费sender单独红包消息(扣款成功)
接入系统socket / websocket
socket
带着本地消息id拉取新消息
获取分发系统可用节点
channel管理user -> channel
用户下线删除session
红包服务
reconnect后重试
实例管理系统
socket (加token)
消费红包消息
session管理
sender
发送request/接收response
抢红包
接入系统N
message管理
protoBuf序列化随机转发到分发系统(添加接入系统ID)
群聊【写扩散】机制避免单点压力snowflake生产messageId
接入系统instance管理instance -> channel
收到已读后,删除离线消息
同一个用户数据要路由到同一个库的同一个表中
IPlist服务
3 投递红包消息(1)c2c(接收者id)(2)c2g(群Id)
分发系统N
分发系统
redis
消费所有聊天topic
通过给每个用户创建SortedSet数据结构根据分数(发送时间)排序并且按用户id路由指定分片
单聊直接发回kafka
红包分发系统1、c2g,通过gid获取session聚合,多线程投递红包消息
本地消息(接入系统宕机方案)
事务最终一致性
receiver
解决timeline模型消息丢失,消息错乱问题1、接入系统发送分发系统,根据用户id路由同一个分发系统2、分发系统发送kafka的时候指定partition路由规则,按用户id路由,保证同一个用户消息进入同一个partition3、阿里Tablestore的timeline存储服务
历史消息
判断用户是否在线考虑离线存储
1、获取接入系统和分发系统节点2、watch实时感知节点状态
认证(JWT本地认证)鉴权
Mysql分库分表
返回新消息
第三方支付
authenticate
2、添加红包发放记录(未领取)
0 条评论
回复 删除
下一页