即时通讯架构
陌陌/李志威/CTO
“社交,是⼈人们运⽤用⼀一定的⽅方式(⼯工具)传递信息,
交流思想,以达到某种⺫⽬目的的社会活动。”
常⻅见于
• 即时通讯,私信应⽤用
• 游戏服务器
• ⻓长连接信息推送
通讯服务器组成
iOS Android
客
户
端
WP
IM
Connector连接集群 LVS
Logic逻辑集群
服务化数据集群(Session/Message)
数
据
层
消息中转
Connector Connector
Logic
Session ClusterMessage Cluster
User A User B
1
2
3 4
5
6
Logic
“对安全性、⾼高可⽤用、扩展性的要求越⾼高,架构的
变化越⼤大。”
iOS Android
客
户
端
WP
IM
Connector连接集群 LVS
Logic逻辑集群
服务化数据集群(Session/Message)
数
据
层
连接层
1. 连接层的作⽤用
2. “允许随时重启更新/
只允许晚上重启/不允
许重启断线”
3. 总的来说简单/异步
陌陌连接层
• 总连接数 1200万+
• 单台服务器压测70万连接,⼀一般使⽤用50%(主流配置)
iOS Android
客
户
端
WP
IM
Connector连接集群 LVS
Logic逻辑集群
服务化数据集群(Session/Message)
数
据
层
逻辑层
1. ⽤用户会话验证
2. 消息存取
3. 异步队列
4. 随时重启
iOS Android
客
户
端
WP
IM
Connector连接集群 LVS
Logic逻辑集群
服务化数据集群(Session/Message)
数
据
层
通讯协议
“
安全性要求
流量要求
传输要求可靠&⾼高效
”
通讯协议
• 常⻅见协议XMPP/SIP
• 缺点:1.流量⼤大 2.不可靠 3.交互复杂
Client Server
WIFI/2G/3G/地铁/电梯
10ms/200ms/12s/TCP half-closed
通信协议设计
⺫⽬目标:
• ⾼高效:弱⺴⽹网络快速的收发
• 可靠:不会丢消息
• 易于扩展
协议格式
Flag Length Data …
Flag Length Data …
msg: 良好的协议可以:
• 简化系统设计
• 提供可靠个⾼高效的消息传输
• 易于扩展需求
Flag Length Data …
REDIS协议
* number of arguments CR LF
$ bytes of argument 1 CR LF data CR LF
$ bytes of argument 2 CR LF data CR LF
SET name latermoon
* 3 $ 3 SET $ 4 name $ 9 latermoon
$ bytes of argument 3 CR LF data CR LF
Redis协议
下⾯面都⽤用Redis协议来描述逻辑
READ REDIS COMMAND
基于队列的消息协议
FIFO
msg6
msg5
msg4
msg3
msg2
msg1
S: msg-send msg1
C: msg-recv 1
S: msg-send msg2
C: msg-recv 2
S: msg-send msg3 msg4 msg 5 msg 6
C: msg-recv 3 4 5 6
Redis List:
基于队列的交互
Client Server
msg-send
msg-recv
msg-send
msg-recv
msg-send
msg-recv
List Base
传统的IM协议
前提是基于⺴⽹网线、WIFI,⺴⽹网络延迟极
⼩小
移动⺴⽹网络下,交互极其费时,服务器
要维护每个状态容易出错
“通讯协议优化,尽量减少⼀一次交互中数据往返的
次数。”
基于版本号的消息协议
Version Message
106 msg
105 msg
104 msg
103 msg
102 msg
101 msg
Redis Sorted Set: S: msg-psh
C: msg-sync
S: msg v 101 msg
S: msg v 102 msg
S: msg v 103 msg
S: msg v 104 msg
C: msg-fin v 104
基于版本号的交互
Client Server
msg-psh
msg-send
msg-sync
msg-send
msg-send
msg-fin
Sorted Set Base
msg-send
针对弱⺴⽹网络的优化协议
• 消息通过版本号维护顺序
• 新消息到达,Server只负责push通知
• Client收到轻量的msg-psh后发出同步
请求
• Server按照版本号连续发送msg
• Client告诉Server收到最后的版本
其它问题
• 核⼼心的⻓长连接只⽤用于传输轻量的实时数据
• 图⽚片、语⾳音等都可以开新的TCP或HTTP连接
“⼀一切就绪后,最重要的就是监控。”
监控
“完”