IM消息系统的设计和实现

简介: IM消息系统的设计和实现

一、名词解释


  • 单播:服务器发送消息给单个客户端用户
  • 多播:服务器发送消息给多个客户端用户
  • 组播/广播:服务器发送消息给一组客户端。有组ID来标识这组用户
  • 上行消息:服务器发送消息给一组客户端。有组ID来标识这组用户
  • 下行消息:服务器端给客户端发送消息


二、系统架构



07d38585b58d265c68d6f283cea1216f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


  • proxy:部署在边缘机房,客户端通过智能dns就近接入
  • logicService:处理认证、心跳、上下线、进出群
  • pushService:单播,广播,接收到消息后转发给comet,之后再由comet把消息发出去
  • imService:聊天服务器,处理单聊群聊,离线消息
  • cosumerService:对群消息进行异步写扩散
  • authService:认证服务


数据结构


cacheService 维护全局在线用户,是一个二级map user_id -> conn_id -> server_id

  • user_id 是业务指定的,唯一标识一个用户
  • conn_id 由存储进程分配,唯一标识该用户的一条连接
  • server_id 标识这条连接属于哪个接入进程

接入进程proxy维护自己在线用户,user_id+conn_id -> Connection

  • Connection 是客户端连接的封装,可以向它推送消息

接入进程proxy维护连接房间信息,room_id -> ConnectionList


三、消息模型


3.1 读扩散模型



ff532474bf3982c9cedd2385846a3dbe_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


  • 优点:只写一次,降低了写入次数,特别在群模式下
  • 缺点: 同步消息的逻辑会比较复杂,接收端每个会话都要读取一次,放大了读,会产生很多无效请求。


3.2 写扩散模型



b3fae2822b1f40b2c94be7f17c554916_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


  • 优点:拉取消息的逻辑简单
  • 缺点: 放大了写,单聊要额外写两次,群里要写N次


四、实现方式


4.1 单聊


4.1.1 设计目标


4.1.2 在线消息



2e4aa80b32c394469e82f9a0dc57ca31_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


4.1.3 离线消息


4.1.4 检测消息丢失


4.2 群聊


4.2.1 设计目标


4.2.2 小群(写扩散)



fac6d136e2996eefe321693d12265227_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


4.2.3 大群(读扩散)


aaa3c36602beee443fae5dcdbc45c966_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


五、高性能分析


瓶颈 CPU > 带宽 > 内存


5.1 容量规划:(阿里云主机16C32G-2.5GHz,预留50%余量)


  • 10,000 conn per proxy
  • 100 proxy
  • 50 logicService/cacheService/pushService
  • or 改进:
  • 10 logicService
  • 5 pushService
  • kafka cluster
  • zookeeper cluster
  • 10 cacheService


5.2内部通信无瓶颈,可水平扩容的路径有:


  • 客户端发起的RPC mobile -> proxy -> micro
  • 上线/下线/切换房间/心跳 mobile -> proxy -> logicService -> cacheService
  • 单播 micro -> logicService (-> cacheService) -> pushService -> proxy -> mobile
  • 在线信息查询
  • 按用户查在线查房间 /session


5.3 内部通信,可能有瓶颈的路径:


  • 批量单播 micro -> logicService ((N-parallel)-> router) -> pushService -> proxy -> mobile
  • 限制:一批用户总数,不宜过多
  • 广播 micro -> logicService -> pushService -> proxy -> mobile
  • 限制:由于pushService定期absorb proxy上的room list, so pushService数量不可过多
  • 改进:logicService和pushService解耦,用kafka连接。由于 pushService 对 CPU 的消耗在 proxy/logicService/cacheService 中最少,只需要非常少的 pushService 实例就行。
  • 在线信息查询
  • 查在线总数 /count 由于logicService定期absorb cacheService上的room users,只能是有限的logicService打开counter定时查
  • 按房间查用户 /room 同 /count
  • 遍历 /list 调试用接口,别用于服务


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: 使用哨兵机制来保证可用性


七、异常情况处理


  • 如何防止消息丢失(接收端上报已接收的最大消息id,异常服务端重发)
  • redis主从切换引起自增id不连续
  • 怎么提高proxy广播的性能
  • 怎么避免rpc的单条连接成为瓶颈


八、低成本、安全


  • 几乎没有外部依赖,极低的运维成本
  • 高性能的代码实现,节省服务器成本
  • 集成认证鉴权,也支持 HTTPS

相关文章
|
6月前
|
网络协议 NoSQL API
转转客服IM系统的WebSocket集群架构设计和部署方案
客服IM系统是转转自研的在线客服系统,是用户和转转客服沟通的重要工具,主要包括机器人客服、人工客服、会话分配、技能组管理等功能。在这套系统中,我们使用了很多开源框架和中间件,今天讲一下客服IM系统中WebSocket集群的的实践和应用。
539 141
|
8月前
|
前端开发 JavaScript Java
智能客服系统的技术栈解析-唯一客服系统技术架构优势
“唯一客服系统”采用 Vue.js 2.x + ElementUI 构建前端,实现响应式界面,支持多端适配;后端基于 Golang + Gin + GORM,具备高性能与高并发处理能力。系统支持私有化部署,提供灵活定制、AI 扩展能力,技术栈简洁易维护,兼顾开发者友好与企业级应用需求。
353 1
|
8月前
|
测试技术 Go
客服系统程序入口文件解析-唯一客服系统源码开发
该代码为 Go 语言编写的客服系统命令行程序入口,结构清晰,使用 cmd 包启动业务逻辑,可能基于 cobra 框架实现,具备良好可扩展性与可维护性,适用于服务启动与管理。
281 69
|
7月前
|
数据安全/隐私保护 容器 Go
开源IM即时通讯系统调研
Lumen IM 是一款企业级开源即时通讯工具,前端采用 Vue3 + Naive UI,后端基于 Go 语言,使用 WebSocket 协议。支持 Docker + Nginx 快速部署,适合私有化环境。功能包括文本、图片、文件消息,内置笔记、群聊及消息历史记录。界面美观、功能完善,适用于企业沟通、团队协作及开发者学习。提供前后端源码,便于快速搭建 IM 系统。
开源IM即时通讯系统调研
|
7月前
|
移动开发 网络协议 小程序
鸿蒙NEXT即时通讯/IM系统RinbowTalk v2.4版发布,基于MobileIMSDK框架、ArkTS编写
RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChat和RainbowChat-Web 技术同源,历经考验。
308 1
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
从0搭建AI智能客服教程(AI智能客服系统选型和实战指南)
针对智能客服技术与业务脱节的痛点,合力亿捷通过 NLP、知识图谱及人机协同策略,助企业实现首次解决率超 70%、人力成本降 43%、年省成本超千万。其方案提升制造业问题解决率 40%,投诉转接成功率达 99%,以分场景选型助力超万家企业平衡业务与成本,成行业首选。
|
8月前
|
缓存 移动开发 网络协议
纯血鸿蒙NEXT即时通讯/IM系统:RinbowTalk正式发布,全源码、纯ArkTS编写
RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍》)。 MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。
588 1
|
8月前
|
人工智能 自然语言处理 语音技术
深度解析:AI语音客服系统如何重塑客户服务体验与主流解决方案探析
在数字化浪潮下,AI语音客服凭借高效、便捷、24小时在线的优势,成为企业提升服务效率、优化体验的重要工具。本文详解其核心技术、应用价值、选型要点及市场主流方案,如阿里云通义晓蜜、合力亿捷等,助力企业智能化升级。
559 1
|
8月前
|
移动开发 缓存 前端开发
可二次开发的在线客服系统-前后端混合渲染模式
服务端渲染(SSR)结合API交互,提升首屏加载速度与SEO友好性,适用于混合渲染模式的Web应用。
150 0

热门文章

最新文章