当前位置:网站首页>一套十万级TPS的IM综合消息系统的架构实践与思考
一套十万级TPS的IM综合消息系统的架构实践与思考
2022-06-28 11:09:00 【InfoQ】
1、引言

2、初版IM架构
2.1 概述
2.2 初版架构介绍

- [1] redis用于存储消息已读未读,缓存连接信息等功能;
- [2] tidb作为开源的分布式数据库,选择它是为了方便消息的存储。
2.3 整体时序图

3、初版IM架构存在的问题及思考
3.1 使用MQ消息总线的问题
3.2 消息落库为写扩散的问题
- 1)微信号称没有存储用户的聊天记录,全是实时推送;
- 2)微信聊天记录全部会在我们手机端存储一份,两台手机终端上的聊天记录并不互通,并且互不可见。
- 1)综合消息中心是会有拉取历史聊天记录(服务端拉取)的功能,存储了全量消息;
- 2)综合消息中心的客户端,需要支持网页版本。
- 1)写扩散对微信这样有移动端的富客户端版本的即时通讯产品十分友好,每个消息在消息分发的时候给处于这个会话(单聊,群聊)下的所有用户所在客户端先推送消息,没找到连接就针对这个用户写一个离线缓存消息,那么下次该用户登录进来,可以从缓存中拉取到该消息,并且清掉缓存;
- 2)写扩散对于我们这类通用综合消息平台并不友好,由于接入方大部分是网页版的客户端,所以没有缓存消息的能力,浏览器刷新就没有了任何消息,所以需要实时去服务端拉取历史消息。假设我是写扩散,在一个群聊中有五百个用户,针对这五百个用户在这个会话,我需要去写五百条消息,大大的增加了写io,并且还不能写缓存(得写数据库)。
3.3 tidb存在不稳定性和事务并发的问题
- 1)tidb在高并发情况下,并发事务会导致事务失败,具体原因不知;
- 2)tidb排错成本高,公司很少有tidb专业运维,经常遇到不走索引的情况。
3.4 群聊、单聊冗余在同一个服务的问题
4、升级版IM架构
4.1 初始架构问题
- 1)tps没达到预期,吞吐量不能满足公司业务的发展;
- 2)使用的存储中间件难以维护(主要是tidb),试错成本高,经常在生产暴露问题,并且速度越来越慢;
- 3)消息写扩散没有太大必要,并大大增加了系统io次数(原因见上一节);
- 4)一些特性无法支持,比如消息图文检索,消息已读未读。
4.2 升级版im架构介绍

- 1)存储端:存储端我们改用了mysql,针对消息服务单独使用了主从mysql集群(主节点用于写消息、从节点用于消息检索)——;
- 2)mq消息总线:与第一版相比没有改动;
- 3)link服务:与第一版相比,改动了link服务到消息分发服务的消息推送方式(由MQ总线方式变更为tcp实时推送);
- 4)消息分发服务:集成了消息处理能力、路由能力,每台消息分发服务拥有所有link服务的tcp连接;
- 5)单聊服务:负责单聊会话的管理能力;
- 6)群聊服务:负责群聊会话的管理能力;
- 7)用户服务:提供用户认证,登录\注册能力。
5、详细对比针对初版IM架构的改动
5.1 改进了不同im实例间的消息分发方式
- 1)初版架构中是:A用户发送消息到link --> 消息总线 --> 消息分发服务 --> 消息总线 --> link --> B用户;
- 2)升级版架构是:用户A --> link --> 消息分发 --> link --> 用户B。
5.2 取消了位置服务
5.3 存储由tidb改成了mysql
5.4 实现了初版无法实现的特性功能
5.5 消息由写扩散改为读扩散
5.6 增加了门面服务
6、优化后的效果对比

7、业务线接入im综合消息系统的业务划分思考
7.1 到底该如何设计高性能通用im综合消息系统

7.2 以客服系统为例

7.3 内部OA通信为例

8、本文小结
9、参考资料
边栏推荐
- [cloud resident co creation] detailed introduction to DWS alarm service DMS and cluster connection mode
- 100 important knowledge points that SQL must master: retrieving data
- GEE:基于 MCD64A1 的 GlobFire 日常火灾数据集
- Excel导入导出便捷工具类
- 李宏毅《机器学习》丨7. Conclusion(总结)
- Docker modifies the user name and password of MySQL
- 培训通知|2022年境外中资企业机构及人员疫情防控和安全防范专题培训通知
- Basic 02: variable, remember the mobile number of the object
- Hystrix deployment
- Xshell和Xftp使用教程
猜你喜欢

线程和线程池

Summary of spatial temporal time series prediction modeling methods

How to use output in katalon

Information hidden in the trend chart of Hong Kong London gold market
This Exception was thrown from a job compiled with Burst, which has limited exception support. 报错

爱可可AI前沿推介(6.28)

JS foundation 1-js introduction and operator

DlhSoft Kanban Library for WPF

AGCO AI frontier promotion (6.28)

Dataease installation upgrade
随机推荐
JS foundation 2
利用soapUI获取freemarker的ftl文件模板
100 important knowledge points that SQL must master: retrieving data
知道 Redis RDB 这些细节,可以少踩很多坑
SQL必需掌握的100个重要知识点:检索数据
选择哪种编程语言,会吸引优秀的人才?
合约量化交易系统开发 | 合约量化APP开发(现成案例)
什么是主链系统?
移动命令
JS foundation 6
字符串 & 堆 & 方法区
使用logrotate对宝塔的网站日志进行自动切割
[practice] appium settings app is not running after 5000ms
实体转JSON时,值为null的字段的丢失问题
Xshell and xftp tutorial
JSON module, hashlib, Base64
How does ETF position affect spot gold price?
爱可可AI前沿推介(6.28)
Décompression par compression
Katalon framework tests web (XX) custom keywords and upload pop-up operations