云信核心架构
整体架构图
┌─────────────────────────────────────────────────────────┐
│ 客户端 SDK 层 │
│ iOS Android Web 小程序 Flutter React Native PC │
└──────────────────────┬──────────────────────────────────┘
│ HTTPS / WebSocket / QUIC
┌──────────────────────▼──────────────────────────────────┐
│ 接入层(Access Layer) │
│ 全球 200+ PoP 节点,就近接入,自动路由 │
└──────────────────────┬──────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────┐
│ 核心服务层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│ │ IM 服务 │ │ RTC 服务 │ │ 直播服务 │ │ 信令服务│ │
│ └──────────┘ └──────────┘ └──────────┘ └─────────┘ │
└──────────────────────┬──────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────┐
│ 基础设施层 │
│ 消息存储(MySQL + HBase) 媒体服务器 CDN 对象存储 │
└─────────────────────────────────────────────────────────┘IM 架构详解
消息路由
发送方 → 接入服务器 → 路由服务 → 接收方在线?
├── 在线:直接推送
└── 离线:存入离线消息队列
→ APNs/FCM/厂商推送消息存储
- 在线消息:Redis 缓存,保证实时性
- 历史消息:HBase 持久化,支持漫游查询
- 消息 ID:全局唯一,基于 Snowflake 算法
- 消息顺序:服务端时序保证,客户端按 msgId 排序
群聊扩散模式
写扩散(小群,< 200 人)
发送方 → 服务端 → 为每个成员写入消息队列
优点:读取快 缺点:写入放大
读扩散(大群,> 200 人)
发送方 → 服务端 → 写入群消息队列
成员拉取时读取群队列
优点:写入效率高 缺点:读取时需合并RTC 架构详解
媒体传输
发送端 → NRTC SDK → WebRTC 协议栈 → 媒体服务器(SFU)→ 接收端
↓
录制服务(可选)- 传输协议:WebRTC(UDP 优先,TCP 备用)
- 编解码:H.264 / VP8(视频),Opus(音频)
- 弱网优化:FEC 前向纠错 + NACK 重传 + JitterBuffer
SFU vs MCU
| 模式 | 适用场景 | 特点 |
|---|---|---|
| SFU(选择性转发) | 多人会议、互动直播 | 低延迟,服务端不解码 |
| MCU(多点控制) | 录制、混流推 CDN | 服务端混流,带宽节省 |
高可用设计
多活架构
用户请求
↓
全局负载均衡(DNS + Anycast)
↓
就近 PoP 节点(接入层)
↓
核心服务集群(多机房主备)
↓
数据层(MySQL 主从 + HBase 多副本)故障切换
- 接入层:单节点故障 < 30s 自动切换
- 核心服务:主备切换 < 60s
- 数据层:MySQL 主从切换 < 30s
安全设计
通信安全
- 传输层:TLS 1.3 加密
- 消息内容:端到端加密(E2EE,可选)
- Token 鉴权:服务端签发,有效期可配置
内容安全
- 与易盾联动,对图片、文字、音视频内容进行实时审核
- 支持自定义敏感词库
- 违规内容自动拦截或人工审核
私有化部署架构
客户私有云 / 专有云
├── 接入层(Nginx 集群)
├── 核心服务(Docker + K8s)
│ ├── IM 服务
│ ├── RTC 媒体服务器
│ └── 管理后台
├── 数据层
│ ├── MySQL 主从
│ ├── Redis 集群
│ └── HBase(可选,大规模消息存储)
└── 对象存储(MinIO 或对接客户已有存储)最小化部署:4 台服务器(2 核心 + 2 媒体) 推荐生产部署:8+ 台服务器,支持 10 万并发