网易首页 > 网易号 > 正文 申请入驻

如何保障分布式IM聊天系统的消息可靠性(即消息不丢)

0
分享至

本文引用了45岁老架构师尼恩的技术分享,有修订和重新排版。

1、引言

接上篇《如何保障分布式IM聊天系统的消息有序性(即消息不乱)》,本文主要聚焦分布式IM聊天系统消息可靠性问题,即如何保证消息不丢失。



2、系列文章

为了更好以进行内容呈现,本文拆分两了上下两篇。

本文是2篇文章中的第1篇:

  • 《如何保障分布式IM聊天系统的消息有序性(即消息不乱)》
  • 《如何保障分布式IM聊天系统的消息可靠性(即消息不丢)》(☜ 本文)

本篇主要聚焦的是分布式IM聊天系统消息可靠性问题。

3、痛点拆解:聊天消息总是丢?不是网络差,是设计没兜底

产品做着做着,用户开始投诉:“我明明发了消息,对方怎么没收到?”。你查日志发现——消息真丢了。但更可怕的是:你也不知道它什么时候丢的。

这背后,其实是移动场景下的经典三连击:

  • 1)地铁进隧道,网络闪断;
  • 2)App 被系统杀掉,进程没了;
  • 3)对方服务器刚好在发布,接口500……

你以为只是“发一下”,其实要穿越重重险境才能抵达。

结果就是:

- 消息发不出去 → 用户以为被无视;
- 或者重试太多 → 对方收到一堆重复“在吗?”;
- 最后用户体验崩了,客服工单爆了。

所以问题本质不是“快不快”,而是:

“宁可慢点,也不能丢;就算重发,也不能重复。”

这就是我们常说的可靠消息投递——一个看似简单的需求,却是高可用系统的分水岭。

4、解决方案:三层兜底,像保险一样层层防

光靠“发一次”肯定不行。

我们要学保险公司,给关键消息上三重保险:

  • 1)自己先复印一份存档 → 客户端本地存
  • 2)邮局签收后锁进保险柜,并异地备份 → 服务端落盘 + 副本
  • 3)如果没收到回执,隔段时间再寄,但对方只认一次 → 超时重试 + 幂等去重

每一层都不贵,合起来却能扛住99%的异常。下面看每层怎么落地。

5、第一层:客户端兜底 —— 消息先存本地,解决网络不稳定问题

记住一句话:只要没收到 ACK,就当没发成功。

所以第一步不是联网,而是先把消息塞进手机本地数据库(比如 SQLite)。

就像下面这样:

db.saveLocalMsg(msg);// 先落库,保命
booleansendOk = network.send(msg);
if(!sendOk) {
scheduleRetry(msg,1000);// 发失败?排队重试

再加上客户端scheduleRetry采用阶梯式重试策略:

  • 1)第1次失败 → 1秒后重试
  • 2)第2次失败 → 3秒后重试
  • 3)第3次失败 → 5秒后重试

避免雪崩式刷屏,既保障可靠性,又不压垮服务。只有等到服务端明确说“我收到了”,才把这条消息从本地删掉。

就像快递发货单:客户签收了,你才能撕票。

这样哪怕 App 崩溃、手机重启,下次打开照样继续发——用户体验无缝衔接。而如果不做这一步?一旦断网或崩溃,消息直接蒸发,用户永远不知道。

6、第二层:服务端兜底 —— 实现 服务端持久化的高可靠

客户端发来了,服务端能不能直接处理完就返回?绝对不行!

如果此时机器宕机,消息还在内存里没来得及持久化,那就真的丢了。

正确做法是两步走:

  • 1)收到消息立刻写入 RocketMQ(支持刷盘、集群同步);
  • 2)同步复制到至少3个副本节点,确保单点故障不丢数据。

伪代码如下:

rocketMQ.send(msg);// 必须落盘,断电也不怕
replicaService.syncTo3Replicas(msg);// 多副本容灾
response.sendAck(msg.getUniqueKey());// 此时才能回 ACK

这一步的关键是:ACK 必须在落盘之后发!否则就是“虚假确认”,等于骗客户端“我收到了”,其实自己也没保住。

这一层扛住了服务端单机崩溃的风险,是整个链路的数据基石。

7、第三层:幂等性设计 —— 保障exact one

前面两层解决了“存得住”的问题,但这还不够。现实是:网络可能超时、包可能丢失、ACK 可能没传回来。

于是客户端必须重试。但重试带来新问题:

“我已经处理过了,再来一遍怎么办?”

解决办法是:用唯一键 + 幂等控制。

每个消息生成全局唯一的 key(如 sessionID:msgID),服务端通过 Redis 的原子操作判断是否已处理。

就像下面的代码这样:

String uniqueKey = msg.getUniqueKey();
if(redis.setNx(uniqueKey,"processed",86400)) {
processMsg(msg);// 第一次来,正常处理
}else{
log.info("重复消息,忽略:{}", uniqueKey);

setNx 是关键:只有 key 不存在时才设置成功,保证多实例并发下也不会重复消费。

8、IM消息可靠性架构的核心流程总结

上面三层如何联动?一张图讲清楚全链路生命周期:



整条链路形成闭环:任何环节出问题,都有对应兜底机制接管。

9、本文小结

至此,《如何保障分布式IM聊天系统的消息有序性和可靠性》这期文章的上下两篇就完结了(上篇点此查看),上篇涉及到的分布式IM聊天系统架构中关于消息有序性问题,下篇则主要聚焦的是消息可靠性问题。

如果你是IM开发新人,想要系统地学习移动端IM开发的话,建议从我整理的这篇《新手入门一篇就够:从零开发移动端IM》开始,这样能保证IM开发知识能从网络到应用层、再从局部设计到整体架构,都有一个系统的学习脉络而不是在信息碎片中苦苦总结。

10、参考资料

[1]什么是IM聊天系统的可靠性?

[2]什么是IM聊天系统的消息时序一致性?

[3]微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)

[4]马蜂窝旅游网的IM系统架构演进之路

[5]一套亿级用户的IM架构技术干货(下篇):可靠性、有序性、弱网优化等

[6]从新手到专家:如何设计一套亿级消息量的分布式IM系统

[7]企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等

[8]融云技术分享:全面揭秘亿级IM消息的可靠投递机制

[9]阿里IM技术分享(四):闲鱼亿级IM消息系统的可靠投递优化实践

[10]阿里IM技术分享(八):深度解密钉钉即时消息服务DTIM的技术设计

[11]基于实践:一套百万消息量小规模IM系统技术要点总结

[12]一套分布式IM即时通讯系统的技术选型和架构设计

[13]转转平台IM系统架构设计与实践(一):整体架构设计

[14]移动端弱网优化专题(一):通俗易懂,理解移动网络的“弱”和“慢”

[15]移动端弱网优化专题(二):史上最全移动弱网络优化方法总结

[16]Web端即时通讯实践干货:如何让你的WebSocket断网重连更快速?

[17]从客户端的角度来谈谈移动端IM的消息可靠性和送达机制

[18]IM消息送达保证机制实现(一):保证在线实时消息的可靠投递

[19]移动端IM中大规模群消息的推送如何保证效率、实时性?

[20]如何保证IM实时消息的“时序性”与“一致性”?

[21]一个低成本确保IM消息时序的方法探讨

即时通讯技术学习:
- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》
- 开源IM框架源码:https://github.com/JackJiang2011/MobileIMSDK(备用地址点此)

本文已同步发布于:http://www.52im.net/thread-4889-1-1.html)

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
你什么状元我什么状元!华子胖虎关键时刻表现根本不在一个级别!

你什么状元我什么状元!华子胖虎关键时刻表现根本不在一个级别!

田先生篮球
2026-02-07 12:25:57
85年我去相亲,丈母娘让我和大姐睡一屋,那晚我目睹了难忘一幕

85年我去相亲,丈母娘让我和大姐睡一屋,那晚我目睹了难忘一幕

奶茶麦子
2026-02-07 17:06:25
22投狂砍48分11助!超级外援向全联盟正式摊牌,王博争冠再添法宝

22投狂砍48分11助!超级外援向全联盟正式摊牌,王博争冠再添法宝

老叶评球
2026-02-08 09:36:11
5年前,他靠核酸检测设备2年狂入222亿,扬言活120岁,如今咋样

5年前,他靠核酸检测设备2年狂入222亿,扬言活120岁,如今咋样

芳芳历史烩
2026-01-25 10:06:32
哈佛跟踪32年发现扎心真相:你能活多久,很大程度取决于你老婆!

哈佛跟踪32年发现扎心真相:你能活多久,很大程度取决于你老婆!

徐德文科学频道
2026-02-06 21:31:27
善恶终有报!88岁瘫坐在轮椅上的谢贤,已活成了一个“笑话”

善恶终有报!88岁瘫坐在轮椅上的谢贤,已活成了一个“笑话”

人间无味啊
2026-01-14 19:49:15
中国崛起,三场对美博弈彻底终结霸权

中国崛起,三场对美博弈彻底终结霸权

小莜读史
2026-02-08 10:29:29
大快人心!乌情报总局官宣:俄军战犯佐托夫被击毙,血债终须血偿

大快人心!乌情报总局官宣:俄军战犯佐托夫被击毙,血债终须血偿

老马拉车莫少装
2026-02-03 23:23:30
假房假妻假儿女,他布局4年骗走香港明星4亿巨款,至今下落不明

假房假妻假儿女,他布局4年骗走香港明星4亿巨款,至今下落不明

不似少年游
2026-02-07 09:33:17
蓝正龙曾爆料:吴佩慈就是所有男生都想踹她的那种女生

蓝正龙曾爆料:吴佩慈就是所有男生都想踹她的那种女生

追影客栈
2026-02-05 17:08:07
为什么全国人民都在拒接电话?连10086打来也是瞄一眼就挂掉了!

为什么全国人民都在拒接电话?连10086打来也是瞄一眼就挂掉了!

今朝牛马
2026-01-08 16:05:10
冰心为什么讨厌林徽因?网友:最可恨的是,林的主业还不是文学

冰心为什么讨厌林徽因?网友:最可恨的是,林的主业还不是文学

夜深爱杂谈
2026-02-05 18:04:39
惊艳世界波!亚马尔25米石破天惊,巴萨大胜:又一18岁天才归来

惊艳世界波!亚马尔25米石破天惊,巴萨大胜:又一18岁天才归来

话体坛
2026-02-08 02:14:23
警告!队歌≠圣旨,应景≠认证!请停止吃央妈的流量!

警告!队歌≠圣旨,应景≠认证!请停止吃央妈的流量!

狗哥是一名内拉
2026-02-07 23:36:36
超雄真的有那么可怕吗?网友的分享,一看一个不吱声

超雄真的有那么可怕吗?网友的分享,一看一个不吱声

另子维爱读史
2026-02-01 20:30:29
带状疱疹为何今年特别多?医生调查:这6类人最容易中招

带状疱疹为何今年特别多?医生调查:这6类人最容易中招

荆医生科普
2026-02-07 15:18:31
美媒:埃及求购歼20谈判有新进展,单价1亿美元?

美媒:埃及求购歼20谈判有新进展,单价1亿美元?

兵国大事
2026-02-07 18:11:44
外卖“碰一下开门”服务已覆盖全国200多城 免登记为城市骑士单均节省1分钟

外卖“碰一下开门”服务已覆盖全国200多城 免登记为城市骑士单均节省1分钟

封面新闻
2026-02-07 16:43:03
1992年,刘强东680分考中国人大,1994年,伍继红692分考中国人大

1992年,刘强东680分考中国人大,1994年,伍继红692分考中国人大

南权先生
2026-02-03 15:52:30
蔬菜水稻大片枯死!河道水体“清而不洁”影响农业生产,3名市人大代表发声

蔬菜水稻大片枯死!河道水体“清而不洁”影响农业生产,3名市人大代表发声

新民晚报
2026-02-06 16:13:03
2026-02-08 11:35:00
即时通讯技术分享
即时通讯技术分享
即时通讯相关技术的研究与分享
472文章数 3621关注度
往期回顾 全部

科技要闻

欧盟认定存在"上瘾"设计 TikTok:结论错误

头条要闻

媒体:特朗普发奥巴马视频 美国"欣赏"该视频的人不少

头条要闻

媒体:特朗普发奥巴马视频 美国"欣赏"该视频的人不少

体育要闻

铜牌与苏翊鸣的这四年,他说:我对得起自己

娱乐要闻

金晨处罚结果曝光!肇事逃逸被罚款

财经要闻

金银震荡144小时 大爷大妈排队「抄底」

汽车要闻

工信部公告落地 全新腾势Z9GT焕新升级

态度原创

亲子
时尚
家居
旅游
公开课

亲子要闻

外婆为了让宝宝穿罩衣拿舅舅现场示范

真爱大牌|| 过年5分钟搞定好气色,用了一整年才来分享

家居要闻

现代轻奢 温馨治愈系

旅游要闻

上海:庙会打破次元壁 又潮又燃中国年

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版