┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 客户端 │ │ API网关 │ │ 微服务群 │
│ Web/App │◄────►│ (go-zero) │◄────►│ (RPC服务) │
└──────────────┘ └──────────────┘ └──────────────┘
▲ ▲
│ │
│ ┌──────────────┐ │
└───────────────┤ WebSocket服务├────────────┘
└──────────────┘
▲
│
┌──────────────┐
│ Kafka │
│ 消息队列 │
└──────────────┘
▲
│
┌──────────────┐
│ 数据存储 │
│MongoDB/MySQL │
└──────────────┘
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 客户端 │ │ 用户API │ │ 用户服务 │ │ 数据库 │
└────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │ │
│ 登录请求 │ │ │
│───────────────►│ │ │
│ │ RPC调用验证 │ │
│ │───────────────►│ │
│ │ │ 查询用户数据 │
│ │ │───────────────►│
│ │ │ │
│ │ │◄───────────────│
│ │ │ │
│ │◄───────────────│ │
│ │ │ │
│ 返回JWT令牌 │ │ │
│◄───────────────│ │ │
│ │ │ │
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 客户端 │ │ IM API │ │ IM服务 │ │ 数据库 │
└────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │ │
│ 创建会话请求 │ │ │
│───────────────►│ │ │
│ │ RPC调用创建会话│ │
│ │───────────────►│ │
│ │ │ 创建会话记录 │
│ │ │───────────────►│
│ │ │ │
│ │ │◄───────────────│
│ │ │ │
│ │◄───────────────│ │
│ │ │ │
│ 返回成功响应 │ │ │
│◄───────────────│ │ │
│ │ │ │
┌──────────┐ ┌───────────────┐ ┌──────────┐
│ 客户端 │ │ WebSocket服务 │ │ JWT验证 │
└────┬─────┘ └───────┬───────┘ └────┬─────┘
│ │ │
│ WS连接请求+令牌 │ │
│──────────────────►│ │
│ │ 验证JWT令牌 │
│ │─────────────────►│
│ │ │
│ │◄─────────────────│
│ │ │
│ WebSocket已连接 │ │
│◄──────────────────│ │
│ │ │
│ user.online消息 │ │
│──────────────────►│ │
│ │ │
│ 返回在线用户列表 │ │
│◄──────────────────│ │
│ │ │
┌──────────┐ ┌───────────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 发送方 │ │ WebSocket服务 │ │ Kafka │ │ 消息处理 │ │ 接收方 │
└────┬─────┘ └───────┬───────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │ │ │
│ conversation.chat│ │ │ │
│─────────────────►│ │ │ │
│ │ │ │ │
│ │ 消息存储到MongoDB│ │ │
│ │─────────────────►│ │ │
│ │ │ │ │
│ │ 消息推送到Kafka │ │ │
│ │─────────────────►│ │ │
│ │ │ │ │
│ 确认消息 │ │ │ │
│◄─────────────────│ │ │ │
│ │ │ │ │
│ │ │ 消费消息 │ │
│ │ │──────────────►│ │
│ │ │ │ │
│ │ │ │ 推送消息 │
│ │ │ │──────────────►│
│ │ │ │ │
┌──────────┐ ┌───────────────┐ ┌──────────┐
│ 发送方 │ │ WebSocket服务 │ │ 接收方 │
└────┬─────┘ └───────┬───────┘ └────┬─────┘
│ │ │
│ push消息 │ │
│─────────────────►│ │
│ │ │
│ │ 查找接收方连接 │
│ │──────────────────┼─────┐
│ │ │ │
│ │ │ │ 如果在线
│ │ │ │
│ │ 直接推送消息 │ │
│ │◄─────────────────┼─────┘
│ │ │
│ │ 如果离线,目前无处理 │
│ │ │
│ 确认消息 │ │
│◄─────────────────│ │
│ │ │
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 客户端 │ │ IM API │ │ IM服务 │ │ 数据库 │
└────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │ │
│ 查询聊天记录 │ │ │
│───────────────►│ │ │
│ │ RPC调用查询 │ │
│ │───────────────►│ │
│ │ │ 查询聊天记录 │
│ │ │───────────────►│
│ │ │ │
│ │ │◄───────────────│
│ │ │ │
│ │◄───────────────│ │
│ │ │ │
│ 返回聊天记录 │ │ │
│◄───────────────│ │ │
│ │ │ │
┌─────────────────────────────────────────────────────────────────────────┐
│ 客户端 │
└───────────────────────────────────┬─────────────────────────────────────┘
│
┌───────────────────────────────┼───────────────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌──────────────┐ ┌──────────┐
│ HTTP API│ │ WebSocket连接 │ │ HTTP API │
│ 会话管理│ │ 实时消息 │ │聊天记录 │
└────┬────┘ └───────┬──────┘ └────┬─────┘
│ │ │
│ │ │
▼ ▼ ▼
┌─────────┐ ┌──────────────┐ ┌──────────────┐
│ IM RPC │ │ WebSocket路由 │ │ IM RPC │
│ 服务 │ │ 处理器 │ │ 服务 │
└────┬────┘ └───────┬──────┘ └─────┬────────┘
│ │ │
│ │ │
▼ ▼ ▼
┌──────────────────────────┐ ┌─────────────────┐ ┌──────────────────┐
│ MongoDB │ │ Kafka │ │ MongoDB │
│ 会话和用户数据存储 │ │ 消息队列 │ │ 聊天记录存储 │
└──────────────────────────┘ └─────────────────┘ └──────────────────┘
-
发送阶段
- 用户A通过WebSocket发送
conversation.chat消息 - WebSocket服务验证JWT令牌并识别用户身份
- 消息被推送到Kafka消息队列
- 消息同时被记录到MongoDB数据库
- 用户A通过WebSocket发送
-
处理阶段
- 消息消费者服务从Kafka获取消息
- 消费者处理消息(格式转换、敏感词过滤等)
- 确定消息目标(单聊或群聊)
-
分发阶段
- 系统查找接收用户的WebSocket连接
- 如果接收用户在线,直接推送消息
- 如果接收用户离线,标记消息为未读
-
确认阶段
- 接收用户收到消息并确认
- 系统更新消息状态为已读
- 更新会话的未读消息计数
-
发送阶段
- 用户A通过WebSocket发送
push消息 - WebSocket服务验证JWT令牌并识别用户身份
- 用户A通过WebSocket发送
-
直接分发阶段
- 系统查找接收用户的WebSocket连接
- 如果接收用户在线,直接推送消息
- 如果接收用户离线,当前不做处理(待完善)
-
确认阶段
- 接收用户收到消息并确认
- 由于消息不存储,无需更新状态
| 处理阶段 | conversation.chat | push |
|---|---|---|
| 消息存储 | 持久存储到MongoDB | 不存储 |
| 传输方式 | 通过Kafka消息队列 | 直接WebSocket推送 |
| 离线处理 | 存储为离线消息 | 当前无处理(丢弃) |
| 延迟特性 | 可能有少量延迟 | 最低延迟 |
| 可靠性 | 高(消息队列保证) | 中等(仅在线时可靠) |
| 适用场景 | 常规聊天消息 | 实时状态更新、临时通知 |