OpenIM多级缓存技术解析

February 26, 2025

OpenIM整体架构

OpenIM 整体架构 OpenIM 是一个高性能、可扩展的即时通信解决方案,由 OpenIM Server(服务端)和 OpenIM SDK(客户端 SDK)两部分组成。 OpenIM Server OpenIM Server 是 OpenIM 的服务端实现,采用微服务架构设计,提供完整的即时通信服务能力。 核心功能: 消息收发:支持实时消息、单聊、群聊等多种消息类型 用户与关系管理:提供完整的用户管理、好友关系、群组管理功能 多端接入:通过 WebSocket 网关和 REST API,支持移动端(iOS/Android)、Web 端(H5/PC)以及第三方应用集成 高可用架构:基于微服务架构,采用消息队列(Kafka)和缓存(Redis)技术,支持水平扩展,保障系统高可用和高性能 OpenIM SDK OpenIM SDK Core 是 OpenIM 的核心 SDK,采用 Go 语言实现,作为跨平台 IM 的基础层,为上层各平台 SDK 提供统一的 IM 能力。 技术特点: 统一核心:各平台 SDK(iOS、Android、Flutter、UniApp 等)基于此核心构建,保证跨平台功能一致性 本地存储:支持消息与数据的本地持久化,提升用户体验和离线能力 消息同步:采用增量与全量同步机制,确保数据一致性和同步效率 事件驱动:基于回调的事件通知机制,方便开发者处理各种 IM 事件 该 SDK 为上层平台 SDK 提供统一的 IM 能力,开发者可基于此快速构建跨平台 IM 应用,大大降低开发成本和维护复杂度。 系统整体架构 graph TB subgraph "外部平台层" iOS[iOS App] Android[Android App] Web[Web/WASM] PC[PC应用] end subgraph "API接口层 (open_im_sdk/)" API[API接口] Caller[调用器<br/>call/syncCall] Listener[监听器管理] end subgraph "核心上下文层 (UserContext)" UC[UserContext<br/>全局上下文管理] Config[配置管理] Status[登录状态管理] end subgraph "业务模块层 (internal/)" Conv[Conversation<br/>会话管理] Msg[ConversationMsg<br/>消息管理] Group[Group<br/>群组管理] User[User<br/>用户管理] Relation[Relation<br/>好友关系] Third[Third<br/>第三方服务] end subgraph "交互层 (interaction/)" LConn[LongConnMgr<br/>长连接管理] MSync[MsgSyncer<br/>消息同步器] WS[WebSocket连接] Heartbeat[心跳机制] Reconnect[重连机制] end subgraph "基础设施层 (pkg/)" DB[(数据库<br/>SQLite)] Cache[缓存层] HTTP[HTTP客户端] Syncer[数据同步器] API_Client[API调用器] end subgraph "回调层 (open_im_sdk_callback/)" ConnCB[连接回调] MsgCB[消息回调] GroupCB[群组回调] UserCB[用户回调] FriendCB[好友回调] end subgraph "OpenIM服务器" Server[IM Server] API_Server[API Server] WS_Server[WebSocket Server] end %% 外部平台到API层 iOS --> API Android --> API Web --> API PC --> API %% API层到核心上下文 API --> Caller Caller --> UC Listener --> UC %% 核心上下文到业务模块 UC --> Conv UC --> Msg UC --> Group UC --> User UC --> Relation UC --> Third %% 业务模块到交互层 Conv --> LConn Msg --> MSync Group --> LConn User --> LConn Relation --> LConn %% 交互层内部 LConn --> WS LConn --> Heartbeat LConn --> Reconnect MSync --> LConn %% 业务模块到基础设施 Conv --> DB Msg --> DB Group --> DB User --> DB Relation --> DB Conv --> Cache User --> Cache Group --> Cache %% 业务模块到API调用 Conv --> API_Client Msg --> API_Client Group --> API_Client User --> API_Client Relation --> API_Client API_Client --> HTTP %% 同步器 User --> Syncer Group --> Syncer Relation --> Syncer Syncer --> API_Client %% 回调层 UC --> ConnCB UC --> MsgCB UC --> GroupCB UC --> UserCB UC --> FriendCB ConnCB --> iOS MsgCB --> iOS GroupCB --> Android UserCB --> Web FriendCB --> PC %% 网络连接 WS --> WS_Server HTTP --> API_Server WS_Server --> Server API_Server --> Server style UC fill:#e1f5ff style LConn fill:#fff4e1 style DB fill:#ffe1f5 style Server fill:#e1ffe1 graph TB subgraph "客户端层" Client1[移动端客户端<br/>iOS/Android] Client2[Web端客户端<br/>H5/PC] Client3[第三方应用<br/>集成SDK] end subgraph "接入层" Gateway[消息网关<br/>openim-msggateway<br/>WebSocket连接管理] API[REST API服务<br/>openim-api<br/>HTTP接口] end subgraph "业务服务层 - RPC服务" AuthRPC[认证服务<br/>openim-rpc-auth] UserRPC[用户服务<br/>openim-rpc-user] FriendRPC[好友服务<br/>openim-rpc-friend] GroupRPC[群组服务<br/>openim-rpc-group] MsgRPC[消息服务<br/>openim-rpc-msg] ConversationRPC[会话服务<br/>openim-rpc-conversation] ThirdRPC[第三方服务<br/>openim-rpc-third] end subgraph "消息处理层" MsgTransfer[消息传输服务<br/>openim-msgtransfer<br/>Kafka消息处理] Push[推送服务<br/>openim-push<br/>消息推送] end subgraph "任务调度层" Cron[定时任务服务<br/>openim-crontask] end subgraph "基础设施层" Kafka[消息队列<br/>Kafka<br/>异步消息处理] Redis[缓存层<br/>Redis<br/>数据缓存/会话] MongoDB[数据存储<br/>MongoDB<br/>持久化存储] end subgraph "外部服务" Webhook[业务回调<br/>Webhooks<br/>事件通知] BusinessServer[业务服务器<br/>第三方系统] end %% 客户端连接 Client1 -->|WebSocket| Gateway Client2 -->|WebSocket| Gateway Client3 -->|HTTP/REST| API Client3 -->|WebSocket| Gateway %% API层调用RPC服务 API -->|gRPC| AuthRPC API -->|gRPC| UserRPC API -->|gRPC| FriendRPC API -->|gRPC| GroupRPC API -->|gRPC| MsgRPC API -->|gRPC| ConversationRPC API -->|gRPC| ThirdRPC %% 网关调用RPC服务 Gateway -->|gRPC| AuthRPC Gateway -->|gRPC| UserRPC Gateway -->|gRPC| MsgRPC Gateway -->|gRPC| ConversationRPC %% RPC服务之间的调用关系 FriendRPC -->|gRPC| UserRPC FriendRPC -->|gRPC| MsgRPC MsgRPC -->|gRPC| UserRPC MsgRPC -->|gRPC| GroupRPC MsgRPC -->|gRPC| FriendRPC MsgRPC -->|gRPC| ConversationRPC %% 消息处理流程 MsgRPC -->|发布消息| Kafka Gateway -->|发布消息| Kafka Kafka -->|消费消息| MsgTransfer MsgTransfer -->|推送消息| Push Push -->|推送通知| Gateway Push -->|推送通知| Client1 Push -->|推送通知| Client2 %% 数据访问 AuthRPC --> Redis AuthRPC --> MongoDB UserRPC --> Redis UserRPC --> MongoDB FriendRPC --> Redis FriendRPC --> MongoDB GroupRPC --> Redis GroupRPC --> MongoDB MsgRPC --> Redis MsgRPC --> MongoDB ConversationRPC --> Redis ConversationRPC --> MongoDB ThirdRPC --> Redis ThirdRPC --> MongoDB MsgTransfer --> MongoDB MsgTransfer --> Redis %% Webhook回调 AuthRPC -.->|事件回调| Webhook UserRPC -.->|事件回调| Webhook FriendRPC -.->|事件回调| Webhook GroupRPC -.->|事件回调| Webhook MsgRPC -.->|事件回调| Webhook Webhook --> BusinessServer %% 定时任务 Cron --> MongoDB Cron --> Redis style Gateway fill:#e1f5ff style API fill:#e1f5ff style AuthRPC fill:#fff4e1 style UserRPC fill:#fff4e1 style FriendRPC fill:#fff4e1 style GroupRPC fill:#fff4e1 style MsgRPC fill:#fff4e1 style ConversationRPC fill:#fff4e1 style ThirdRPC fill:#fff4e1 style MsgTransfer fill:#e8f5e9 style Push fill:#e8f5e9 style Kafka fill:#f3e5f5 style Redis fill:#f3e5f5 style MongoDB fill:#f3e5f5 消息流转架构 sequenceDiagram participant Client as 客户端 participant Gateway as 消息网关 participant MsgRPC as 消息RPC服务 participant Kafka as Kafka队列 participant Transfer as 消息传输服务 participant Push as 推送服务 participant MongoDB as MongoDB participant Redis as Redis Client->>Gateway: WebSocket连接 Gateway->>MsgRPC: 发送消息请求 MsgRPC->>Redis: 检查缓存 MsgRPC->>MongoDB: 存储消息 MsgRPC->>Kafka: 发布消息到队列 MsgRPC-->>Gateway: 返回消息ID Gateway-->>Client: 确认消息已发送 Kafka->>Transfer: 消费消息 Transfer->>MongoDB: 持久化消息 Transfer->>Redis: 更新缓存 Transfer->>Push: 触发推送 Push->>Gateway: 推送消息 Gateway->>Client: 实时推送消息 核心组件说明 接入层 openim-msggateway: WebSocket 消息网关,管理客户端长连接,支持百万级并发连接 openim-api: RESTful API 服务,提供 HTTP 接口供业务系统调用 业务服务层(RPC服务) openim-rpc-auth: 用户认证、Token 管理 openim-rpc-user: 用户信息管理、用户资料 openim-rpc-friend: 好友关系管理、好友申请 openim-rpc-group: 群组管理、群成员管理 openim-rpc-msg: 消息发送、消息存储、消息查询 openim-rpc-conversation: 会话管理、会话列表 openim-rpc-third: 第三方服务集成 消息处理层 openim-msgtransfer: 消息传输服务,从 Kafka 消费消息并处理 openim-push: 推送服务,负责消息推送通知 定时任务层 openim-crontask: 定时任务服务,处理定时清理、统计等任务 基础设施 MongoDB: 持久化存储,存储用户、消息、群组等数据 Redis: 缓存层,存储热点数据、会话信息 Kafka: 消息队列,异步处理消息,解耦服务 扩展功能 Webhooks: 事件回调机制,支持业务系统集成 Prometheus: 监控指标收集 服务发现: 支持 Kubernetes、Etcd 等服务发现机制 技术特点 微服务架构: 服务间通过 gRPC 通信,支持独立部署和扩展 高可用: 支持集群部署,服务可水平扩展 高性能: Redis 缓存热点数据 Kafka 异步消息处理 WebSocket 长连接支持 可扩展: Webhook 回调机制 REST API 接口 支持第三方系统集成

February 26, 2025

为什么IM需要消息序号?

TCP协议

February 26, 2025