IM 系统长连接架构
微信如何保证消息不丢不重、实时到达?从一个简化的 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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!