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

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

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

相关文章
|
4天前
|
人工智能 定位技术 SEO
我学 GEO 第 15 天:终于知道AI GEO该如何做?
我是暴走的莉莉酱,边旅行边研究AI GEO的数字游民。专注普通人如何提升“AI可见度”——让AI在回答用户问题时准确识别、理解并推荐你。不讲玄学,只做可测、可调、可持续的GEO实践。
377 124
|
4天前
|
缓存 人工智能 运维
阿里云618百炼大模型Qwen3.7-Max功能、免费试用、订阅计费、配置接入详解
Qwen3.7-MAX是阿里云百炼平台推出的通义千问3.7系列旗舰大语言模型,专为智能体时代复杂任务打造,依托阿里云全域算力与自研技术,在逻辑推理、长文本处理、代码工程、长周期自主执行等领域达到行业顶尖水平。2026年618期间,该模型推出多重免费试用权益、按量计费5折、订阅套餐优惠等专属福利,覆盖个人开发者、团队与企业全场景需求,以下从核心功能、免费试用、订阅计费、配置接入四方面展开详细解析。
377 123
|
2天前
|
人工智能 自然语言处理 API
阿里云Token Plan团队版解析:功能、三档套餐与省钱订阅指南
阿里云百炼平台推出的Token Plan团队版,是面向企业与团队的AI大模型订阅服务,以Credits为统一计量单位,整合文本与图像生成模型,提供团队管理、数据安全、多工具兼容等核心能力,解决团队零散订阅AI服务的管理混乱、成本失控、数据安全等痛点。本文将从核心定位、套餐详情、计费规则、团队管理、工具兼容、便宜订阅技巧等方面,全面解析Token Plan团队版,帮助企业与团队高效、低成本地使用AI服务。
288 108
|
18天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2026 年 5 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
356 129
|
存储 监控 Java
Java日志上云三剑客:Log4J/LogBack/Producer Lib
日志服务提供30多种数据采集方式,针对服务器、移动端、嵌入式设备及各种开发语言都提供完整的接入方案。对 Java 开发者而言,没有什么比熟悉的日志框架 Log4j、Log4j2、Logback Appender 更好使的了。
25305 138
|
负载均衡 Kubernetes 安全
服务网格ASM使用FAQ之(5):ASM网关支持在SLB侧创建HTTPS类型的监听
ASM网关提供HTTPS安全支持、证书动态加载,从而提升ASM网关安全性。除了在ASM网关侧绑定证书的方式之外, 还可以在负载均衡侧管理证书。 本文介绍如何支持ASM网关服务在负载均衡侧绑定证书, 并创建HTTPS类型的监听。
930 142
|
SQL 运维 监控
酷!在终端上使用命令行可视化分析日志
运维工程师在通过日志调查问题时,或者通过日志搭建监控系统时,不仅需要查看原始的日志内容,还需要把日志经多深度加工分析,例如计算每分钟的延时,每分钟的流量等等监控。这些数字指标,如果能够通过可视化的手段直观的展示出来,会更直观、有效的理解监控数据。今天我们介绍一种比较简洁、也比较酷的可视化方式,就是在终端上直接通过命令行可视化分析日志。
1152 136
|
消息中间件 Java 应用服务中间件
阿里巴巴微服务开源项目盘点(持续更新)
【Apache Dubbo】 Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,是国内影响力最大、使用最广泛的开源服务框架之一,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
14299 119
|
Linux
2020阿里云域名优惠口令及优惠口令获取方法
阿里云域名优惠口令可用于域名注册、域名续费,2020阿里云域名优惠口令获取方法
10268 136
2020阿里云域名优惠口令及优惠口令获取方法
|
Web App开发 前端开发 算法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
例如:12的全排列是12、21,123的全排列是123、132、213、231、312、321。依次类推:1234的全排列是……… 在123 的全排列中,我们使用3个盒子存放即将放进的数字,每当走到一个盒子前就把手中的数字放进去,手中的数字没了之后,再次返回,把盒子中的数字拿走,再次进行排列。
1343 136