Skip to content

Latest commit

 

History

History
254 lines (227 loc) · 16.5 KB

File metadata and controls

254 lines (227 loc) · 16.5 KB

ExampleIM 系统流程与架构

系统整体架构

┌──────────────┐      ┌──────────────┐      ┌──────────────┐
│  客户端      │      │  API网关      │      │  微服务群    │
│  Web/App     │◄────►│  (go-zero)   │◄────►│  (RPC服务)   │
└──────────────┘      └──────────────┘      └──────────────┘
        ▲                                           ▲
        │                                           │
        │               ┌──────────────┐            │
        └───────────────┤ WebSocket服务├────────────┘
                        └──────────────┘
                               ▲
                               │
                        ┌──────────────┐
                        │   Kafka      │
                        │ 消息队列     │
                        └──────────────┘
                               ▲
                               │
                        ┌──────────────┐
                        │  数据存储    │
                        │MongoDB/MySQL │
                        └──────────────┘

1. 用户认证流程

┌──────────┐     ┌──────────┐     ┌──────────┐    ┌──────────┐
│  客户端  │     │  用户API │     │ 用户服务  │    │  数据库  │
└────┬─────┘     └────┬─────┘     └────┬─────┘    └────┬─────┘
     │                │                │                │
     │  登录请求      │                │                │
     │───────────────►│                │                │
     │                │ RPC调用验证    │                │
     │                │───────────────►│                │
     │                │                │  查询用户数据  │
     │                │                │───────────────►│
     │                │                │                │
     │                │                │◄───────────────│
     │                │                │                │
     │                │◄───────────────│                │
     │                │                │                │
     │  返回JWT令牌   │                │                │
     │◄───────────────│                │                │
     │                │                │                │

2. 会话建立流程

┌──────────┐     ┌──────────┐     ┌──────────┐    ┌──────────┐
│  客户端  │     │  IM API  │     │  IM服务  │    │  数据库  │
└────┬─────┘     └────┬─────┘     └────┬─────┘    └────┬─────┘
     │                │                │                │
     │  创建会话请求  │                │                │
     │───────────────►│                │                │
     │                │ RPC调用创建会话│                │
     │                │───────────────►│                │
     │                │                │ 创建会话记录   │
     │                │                │───────────────►│
     │                │                │                │
     │                │                │◄───────────────│
     │                │                │                │
     │                │◄───────────────│                │
     │                │                │                │
     │  返回成功响应  │                │                │
     │◄───────────────│                │                │
     │                │                │                │

3. WebSocket连接建立流程

┌──────────┐     ┌───────────────┐    ┌──────────┐
│  客户端  │     │ WebSocket服务 │    │ JWT验证  │
└────┬─────┘     └───────┬───────┘    └────┬─────┘
     │                   │                  │
     │  WS连接请求+令牌  │                  │
     │──────────────────►│                  │
     │                   │  验证JWT令牌     │
     │                   │─────────────────►│
     │                   │                  │
     │                   │◄─────────────────│
     │                   │                  │
     │  WebSocket已连接  │                  │
     │◄──────────────────│                  │
     │                   │                  │
     │  user.online消息  │                  │
     │──────────────────►│                  │
     │                   │                  │
     │  返回在线用户列表 │                  │
     │◄──────────────────│                  │
     │                   │                  │

4. 消息发送流程 - Chat模式(通过Kafka)

┌──────────┐    ┌───────────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│ 发送方   │    │ WebSocket服务 │    │  Kafka   │    │ 消息处理 │    │ 接收方   │
└────┬─────┘    └───────┬───────┘    └────┬─────┘    └────┬─────┘    └────┬─────┘
     │                  │                  │               │               │
     │ conversation.chat│                  │               │               │
     │─────────────────►│                  │               │               │
     │                  │                  │               │               │
     │                  │ 消息存储到MongoDB│               │               │
     │                  │─────────────────►│               │               │
     │                  │                  │               │               │
     │                  │ 消息推送到Kafka  │               │               │
     │                  │─────────────────►│               │               │
     │                  │                  │               │               │
     │ 确认消息         │                  │               │               │
     │◄─────────────────│                  │               │               │
     │                  │                  │               │               │
     │                  │                  │ 消费消息      │               │
     │                  │                  │──────────────►│               │
     │                  │                  │               │               │
     │                  │                  │               │ 推送消息      │
     │                  │                  │               │──────────────►│
     │                  │                  │               │               │

5. 消息发送流程 - Push模式(直接推送)

┌──────────┐    ┌───────────────┐    ┌──────────┐
│ 发送方   │    │ WebSocket服务 │    │ 接收方   │
└────┬─────┘    └───────┬───────┘    └────┬─────┘
     │                  │                  │
     │    push消息      │                  │
     │─────────────────►│                  │
     │                  │                  │
     │                  │ 查找接收方连接   │
     │                  │──────────────────┼─────┐
     │                  │                  │     │
     │                  │                  │     │ 如果在线
     │                  │                  │     │
     │                  │ 直接推送消息     │     │
     │                  │◄─────────────────┼─────┘
     │                  │                  │
     │                  │ 如果离线,目前无处理   │
     │                  │                  │
     │ 确认消息         │                  │
     │◄─────────────────│                  │
     │                  │                  │

6. 聊天记录查询流程

┌──────────┐     ┌──────────┐     ┌──────────┐    ┌──────────┐
│  客户端  │     │  IM API  │     │  IM服务  │    │  数据库  │
└────┬─────┘     └────┬─────┘     └────┬─────┘    └────┬─────┘
     │                │                │                │
     │  查询聊天记录  │                │                │
     │───────────────►│                │                │
     │                │ RPC调用查询    │                │
     │                │───────────────►│                │
     │                │                │ 查询聊天记录   │
     │                │                │───────────────►│
     │                │                │                │
     │                │                │◄───────────────│
     │                │                │                │
     │                │◄───────────────│                │
     │                │                │                │
     │  返回聊天记录  │                │                │
     │◄───────────────│                │                │
     │                │                │                │

7. 完整通信流程

┌─────────────────────────────────────────────────────────────────────────┐
│                               客户端                                     │
└───────────────────────────────────┬─────────────────────────────────────┘
                                    │
    ┌───────────────────────────────┼───────────────────────────────────┐
    │                               │                                   │
    ▼                               ▼                                   ▼
┌─────────┐                  ┌──────────────┐                    ┌──────────┐
│ HTTP API│                  │ WebSocket连接 │                    │ HTTP API │
│ 会话管理│                  │ 实时消息     │                    │聊天记录  │
└────┬────┘                  └───────┬──────┘                    └────┬─────┘
     │                               │                                │
     │                               │                                │
     ▼                               ▼                                ▼
┌─────────┐                  ┌──────────────┐                  ┌──────────────┐
│ IM RPC  │                  │ WebSocket路由 │                  │   IM RPC     │
│ 服务   │                  │  处理器       │                  │   服务       │
└────┬────┘                  └───────┬──────┘                  └─────┬────────┘
     │                               │                                │
     │                               │                                │
     ▼                               ▼                                ▼
┌──────────────────────────┐  ┌─────────────────┐           ┌──────────────────┐
│       MongoDB            │  │     Kafka       │           │     MongoDB      │
│  会话和用户数据存储      │  │   消息队列      │           │   聊天记录存储   │
└──────────────────────────┘  └─────────────────┘           └──────────────────┘

8. 消息处理生命周期

常规聊天消息 (conversation.chat)

  1. 发送阶段

    • 用户A通过WebSocket发送conversation.chat消息
    • WebSocket服务验证JWT令牌并识别用户身份
    • 消息被推送到Kafka消息队列
    • 消息同时被记录到MongoDB数据库
  2. 处理阶段

    • 消息消费者服务从Kafka获取消息
    • 消费者处理消息(格式转换、敏感词过滤等)
    • 确定消息目标(单聊或群聊)
  3. 分发阶段

    • 系统查找接收用户的WebSocket连接
    • 如果接收用户在线,直接推送消息
    • 如果接收用户离线,标记消息为未读
  4. 确认阶段

    • 接收用户收到消息并确认
    • 系统更新消息状态为已读
    • 更新会话的未读消息计数

直接推送消息 (push)

  1. 发送阶段

    • 用户A通过WebSocket发送push消息
    • WebSocket服务验证JWT令牌并识别用户身份
  2. 直接分发阶段

    • 系统查找接收用户的WebSocket连接
    • 如果接收用户在线,直接推送消息
    • 如果接收用户离线,当前不做处理(待完善)
  3. 确认阶段

    • 接收用户收到消息并确认
    • 由于消息不存储,无需更新状态

关键流程差异

conversation.chat vs push

处理阶段 conversation.chat push
消息存储 持久存储到MongoDB 不存储
传输方式 通过Kafka消息队列 直接WebSocket推送
离线处理 存储为离线消息 当前无处理(丢弃)
延迟特性 可能有少量延迟 最低延迟
可靠性 高(消息队列保证) 中等(仅在线时可靠)
适用场景 常规聊天消息 实时状态更新、临时通知