微信如何保证消息不丢不重、实时到达?从一个简化的 IM 系统设计看长连接、消息可靠性和分布式架构。

一、IM 系统的核心挑战

  • 1.1 实时性——毫秒级消息到达
  • 1.2 可靠性——消息不丢不重
  • 1.3 一致性——多端消息同步
  • 1.4 海量连接——千万级长连接

二、通信协议选型

  • 2.1 短轮询——简单但浪费资源
  • 2.2 长轮询——半实时
  • 2.3 WebSocket——全双工,浏览器原生支持
  • 2.4 TCP 长连接——App 端最优选择
  • 2.5 协议格式——Protobuf 二进制

三、长连接管理

  • 3.1 连接建立——握手 + 鉴权
  • 3.2 Session 管理——userId → connectionId 映射
  • 3.3 心跳保活——Ping/Pong,超时断开
  • 3.4 断线重连——指数退避重连

四、消息投递流程

  • 4.1 发送——客户端 → 接入层 → 消息服务 → 存储 → 推送
  • 4.2 在线消息——直接推送
  • 4.3 离线消息——存储后等上线再推
  • 4.4 消息 ACK——客户端确认机制

五、消息可靠性的多层保障

  • 5.1 客户端重发——超时未收到 ACK
  • 5.2 服务端去重——msgId 去重
  • 5.3 存储层——先写消息再推送
  • 5.4 至少一次 vs 精确一次

六、分布式架构

  • 6.1 接入层网关——Netty + WebSocket
  • 6.2 消息路由——根据 userId 哈希到消息服务
  • 6.3 存储——MySQL(消息元数据)+ Redis(会话列表)+ OSS(多媒体)
  • 6.4 多端同步——SeqId 机制

七、总结

  • IM 系统的核心——连接管理 + 消息可靠性 + 分布式路由
  • 技术选型——Netty + Protobuf + Redis + Kafka