这篇文章给大家介绍IM消息系统的设计和实现是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、名词解释
二、系统架构
proxy:部署在边缘机房,客户端通过智能dns就近接入
logicService:处理认证、心跳、上下线、进出群
pushService:单播,广播,接收到消息后转发给comet,之后再由comet把消息发出去
imService:聊天服务器,处理单聊群聊,离线消息
cosumerService:对群消息进行异步写扩散
authService:认证服务
数据结构
cacheService 维护全局在线用户,是一个二级map
user_id -> conn_id -> server_id
。接入进程proxy维护自己在线用户,
user_id+conn_id -> Connection
接入进程proxy维护连接房间信息,
room_id -> ConnectionList
三、消息模型
3.1 读扩散模型
3.2 写扩散模型
优点:拉取消息的逻辑简单
缺点: 放大了写,单聊要额外写两次,群里要写N次
四、实现方式
4.1 单聊
4.1.1 设计目标
4.1.2 在线消息
4.1.3 离线消息
4.1.4 检测消息丢失
4.2 群聊
4.2.1 设计目标
4.2.2 小群(写扩散)
4.2.3 大群(读扩散)
五、高性能分析
5.1 容量规划:(阿里云主机16C32G-2.5GHz,预留50%余量)
5.2内部通信无瓶颈,可水平扩容的路径有:
客户端发起的RPC mobile -> proxy -> micro
上线/下线/切换房间/心跳 mobile -> proxy -> logicService -> cacheService
单播 micro -> logicService (-> cacheService) -> pushService -> proxy -> mobile
在线信息查询
5.3 内部通信,可能有瓶颈的路径:
5.4 proxy性能瓶颈
5.5 rpc性能瓶颈
六、高可用分析
为用户提供 7-24 小时无间断服务。迭代式开发,要求内在模块和业务服务的升级、扩容对用户无感知。proxy 无状态服务,重启、升级时,客户端检测到连接断开,自动重连到另一个 proxy
logicService 无状态服务,重启、升级时,proxy 会自动寻找下一个 logic
pushService 无状态服务,重启、升级时,有其它 pushService对外提供服务
cacheService 有状态服务,重启、升级时,由备 cacheService 顶上;升级完成,切回主 cacheService
imService 无状态服务,重启、升级时,有其它 pushService对外提供服务
mysql:使用mysql master master机制来保证
redis: 使用哨兵机制来保证可用性
七、异常情况处理
八、低成本、安全
几乎没有外部依赖,极低的运维成本
高性能的代码实现,节省服务器成本
集成认证鉴权,也支持 HTTPS
关于IM消息系统的设计和实现是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。