一条IM消息的分布式之旅:从发送到已读

简介: 一条消息从点击“发送”到对方收到,背后是分布式系统的精密协作:经WebSocket接入→Center事务落库→Redis查在线状态→定向投递→ACK确认→已读回执,全程保障可靠性与实时性。(238字)

一条消息从发送到送达, 中间到底经历了什么。 表面上用户只是点了一下“发送”, 实际上后端已经开始了一场分布式协作。
个人项目:https://github.com/w3777/xigua-cloud

image.png

1. 消息从客户端出发

用户在客户端输入内容后,消息会先通过 WebSocket 长连接发送到接入节点。

这里的接入层,本质上更像一个“网关”。

它不负责真正处理消息,只负责:

  • 维护连接
  • 心跳检测
  • 用户在线状态
  • 转发消息

所以接入节点收到消息后,会通过 Dubbo RPC 把消息转发到 Center 消息中枢。

这时候,真正的消息链路才刚开始。


2. Center 开始接管消息

Center 服务收到消息后,

这里会完成几件事情:

  • 生成 messageId
  • 开启事务
  • 消息持久化
  • 更新会话状态

消息会先进入 MySQL。

因为只有真正落库成功,这条消息才算存在。

否则客户端看到“发送成功”,结果服务重启后消息没了,这其实是最严重的问题。


3. ACK 为什么很重要

很多人以为:

客户端点发送后,服务端回个 success 就结束了。

实际上不是。

IM 里的 ACK,更像一种“确认机制”。

只有消息真正完成持久化后,服务端才会把 ACK 返回给发送者。

客户端收到 ACK 后:

  • 消息状态变成“发送成功”
  • 本地 loading 消失
  • 消息进入正常展示状态

如果 ACK 超时没回来,客户端就会认为发送失败。

这里有个细节:

ACK 不能回太早。

因为:

如果 ACK 已经返回,但事务实际上失败了,客户端会误认为消息发送成功。

这也是为什么很多 IM 系统,会把 ACK 放在事务后面。


4. Redis 开始发挥作用

消息落库后,系统会开始查接收者在线状态。这里不会查数据库。

因为数据库扛不住高频在线查询。

在线状态、会话状态、未读数量这些数据, 都会放进 Redis。

Redis 在 IM 里,其实更像一个“实时状态中心”。

系统会根据 Redis 中记录的:

  • 用户在线节点
  • 当前连接机器
  • 会话状态

去定位:

“这个人现在到底连在哪台机器上。”


5. 定向投递开始

找到接收者所在节点后,Center 会再次通过 Dubbo RPC:

把消息定向投递到对应机器。

这里有个关键点:

发送者和接收者,可能根本不在同一台服务器。

比如:

发送者连接的是节点 A, 接收者连接的是节点 B。

所以消息一定会经过:

接入层 → Center → 另一台接入层

这也是 IM 分布式架构里,最核心的一层:

消息中枢。


6. 消息真正送达

接收节点收到消息后,会通过 WebSocket:

把消息推送给接收者客户端。

这时候用户终于看到消息。

但其实流程还没结束。

因为:

“收到消息”不等于“已读消息”。


7. 已读回执才是最后一步

当用户真正打开聊天窗口后,客户端会发送已读回执。

服务端收到后:

  • 更新消息已读状态
  • 同步会话状态
  • 更新未读数量
  • 通知发送方“对方已读”

至此, 一条消息的生命周期才真正结束。


8. 消息系统真正难的地方

真正复杂的是:

  • ACK 一致性
  • 在线状态同步
  • 分布式路由
  • 消息可靠性
  • 会话状态维护
  • 未读数量计算
  • 已读同步
  • 多端登录
  • 节点故障恢复

很多时候,聊天窗口只是表象。

底层其实是一套实时分布式系统。

相关文章
|
5天前
|
运维 网络协议
KKCE 在线 Ping|实用网络连通性检测小工具
KKCE在线Ping是一款免安装、浏览器直用的网络检测工具,支持多节点同步测试域名/IP连通性、延迟与丢包率,直观定位卡顿、访问异常等基础网络问题,兼顾个人排查与运维需求。(239字)
205 1
|
12天前
|
弹性计算 人工智能 运维
阿里云服务器2核4G199元1年:轻量应用服务器抢购和云服务器u1实例对比与选购策略参考
阿里云服务器2核4G热门配置价格:轻量应用服务器2核4G(199元/年)与云服务器ECS通用算力型u1实例2核4G(199元/年)。二者虽价格相同,但定位截然不同:轻量服务器主打开箱即用,峰值带宽达200M,预装OpenClaw等AI镜像,适合新用户快速建站或AI尝鲜,但续费价格较高且需每日限时抢购;ECS u1实例则提供5M固定带宽、80G云盘,支持VPC等深度定制,企业新老用户同享,且承诺续费同价至2027年3月,长期成本更可控。本文从产品定位、适用场景、购买资格、续费政策等维度提供了以供对比与选购策略,帮助个人开发者与中小企业根据业务需求做出最优选择。
183 10
|
9天前
|
消息中间件 数据可视化 API
阿里云短信服务怎么接入?从签名、模板、API 到发送回执,一文讲清楚
本片文章将围绕阿里云短信服务的完整接入链路,拆解从资质申请、签名审核、模板配置、运营商报备,到 API 发送和状态回执的关键步骤,帮助产品经理、运营人员、技术负责人和开发者快速理解短信服务接入流程,提前做好上线准备。
176 5
|
8天前
|
人工智能 自然语言处理 Java
Java做AI真不行?2026年最被低估的机会来了
Spring官宣集成DeepSeek,Java正式迈入AI驱动时代!2026年AI岗位缺口巨大,大厂招聘普遍要求大模型能力。Java团队借力Spring生态与JBoltAI等国产框架,可低门槛接入代码生成、RAG、Agent等全链路AI能力,实现差异化突围。(239字)
112 3
|
5天前
|
人工智能 自然语言处理 监控
OpenClaw“养龙虾”保姆级教程:从零基础部署到进阶玩法与安全避坑指南
2026年,一款名为OpenClaw的开源AI智能体迅速走红全网,凭借红色龙虾样式的标识,被爱好者亲切称作“龙虾”,而部署、调教与使用OpenClaw的全过程,也被大家戏称为“养龙虾”。OpenClaw的核心理念是打造真正能落地执行任务的AI,它打破了传统AI仅停留在对话交互的局限,通过赋予模型操作系统、操控软件、读写文件、控制浏览器、执行代码等真实操作权限,让AI从“聊天助手”升级为可以自主干活的数字员工,能够理解自然语言指令并独立完成一系列自动化工作流。
252 7
|
5天前
|
人工智能 运维
Agentic Ops 企业级可观测性运维智能体实战研讨会,邀您5月29日北京见!
阿里云将于5月29日在北京阿里巴巴朝阳科技园举办【Agentic Ops已来:企业级可观测性运维智能体实战】技术沙龙,聚焦企业级可观测性运维智能体实战。扫码或点击链接立即报名!
|
28天前
|
人工智能 小程序 机器人
超详细!OpenClaw一键部署实操教程,快速上手不踩坑
OpenClaw是开源AI智能体,可处理文件、操控浏览器、接入钉钉等IM工具。本文详解阿里云三大一键部署方案(轻量服务器/计算巢/无影云电脑),2步完成部署,零代码配置,助你快速启用“数字员工”!
503 6
|
6天前
|
缓存 监控 安全
别再让Docker占满你的硬盘!一篇搞定docker system所有命令
本指南详解 `docker system` 命令组,助你精准诊断与优雅清理 Docker 占用空间:`df` 查磁盘、`prune` 清资源、`info` 看配置、`events` 监事件。覆盖安全清理策略、自动化脚本与环境最佳实践,告别“磁盘爆满”焦虑。(239字)
94 2
别再让Docker占满你的硬盘!一篇搞定docker system所有命令
|
1月前
|
人工智能 弹性计算 数据可视化
OpenClaw一键部署保姆级教程,新手小白也能轻松“养龙虾”!
OpenClaw(“龙虾”)是一款开源AI智能体,因红色小龙虾图标得名,部署过程被戏称“养龙虾”。本文提供阿里云一键部署保姆级教程:两步搞定——购买预装镜像服务器+可视化配置API密钥,新手零代码即可拥有专属AI助理!
280 11
|
2天前
|
JavaScript 安全 Java
【日常小问】Spring Cloud Gateway 5.x 跨域和路由配置踩坑实录
Spring Cloud Gateway 升级 5.x 后,配置前缀改为 spring.cloud.gateway.server.webflux,依赖坐标改名为 spring-cloud-starter-gateway-server-webflux,CORS 需网关统一处理,避免下游服务重复设置导致浏览器拒绝。
62 1