即时通讯架构陌陌/李志威/CTO“社交,是⼈人们运⽤用⼀一定的⽅方式(⼯工具)传递信息,交流思想,以达到某种⺫⽬目的的社会活动。”常⻅见于•即时通讯,私信应⽤用 •游戏服务器 •⻓长连接信息推送通讯服务器组成iOSAndroid客户端WPIMConnector连接集群LVSLogic逻辑集群服务化数据集群(Session/Message)数 据层消息中转ConnectorConnectorLogicSessionClusterMessageClusterUserAUserB123456Logic“对安全性、⾼高可⽤用、扩展性的要求越⾼高,架构的变化越⼤大。”iOSAndroid客户端WPIMConnector连接集群LVSLogic逻辑集群服务化数据集群(Session/Message)数 据层连接层1.连接层的作⽤用 2.“允许随时重启更新/只允许晚上重启/不允许重启断线” 3.总的来说简单/异步陌陌连接层•总连接数1200万+ •单台服务器压测70万连接,⼀一般使⽤用50%(主流配置)iOSAndroid客户端WPIMConnector连接集群LVSLogic逻辑集群服务化数据集群(Session/Message)数 据层逻辑层1.⽤用户会话验证 2.消息存取 3.异步队列 4.随时重启iOSAndroid客户端WPIMConnector连接集群LVSLogic逻辑集群服务化数据集群(Session/Message)数 据层通讯协议“ 安全性要求 流量要求 传输要求可靠&⾼高效 ”通讯协议•常⻅见协议XMPP/SIP •缺点:1.流量⼤大2.不可靠3.交互复杂ClientServerWIFI/2G/3G/地铁/电梯10ms/200ms/12s/TCPhalf-closed通信协议设计⺫⽬目标: •⾼高效:弱⺴⽹网络快速的收发 •可靠:不会丢消息 •易于扩展协议格式FlagLengthData…FlagLengthData…msg:良好的协议可以: •简化系统设计 •提供可靠个⾼高效的消息传输 •易于扩展需求FlagLengthData…REDIS协议*numberofargumentsCRLF$bytesofargument1CRLFdataCRLF$bytesofargument2CRLFdataCRLFSETnamelatermoon *3$3SET$4name$9latermoon$bytesofargument3CRLFdataCRLFRedis协议下⾯面都⽤用Redis协议来描述逻辑READREDISCOMMAND基于队列的消息协议FIFOmsg6msg5msg4msg3msg2msg1S:msg-sendmsg1 C:msg-recv1 S:msg-sendmsg2 C:msg-recv2 S:msg-sendmsg3msg4msg5msg6 C:msg-recv3456RedisList:基于队列的交互ClientServermsg-sendmsg-recvmsg-sendmsg-recvmsg-sendmsg-recvListBase传统的IM协议 前提是基于⺴⽹网线、WIFI,⺴⽹网络延迟极⼩小 移动⺴⽹网络下,交互极其费时,服务器要维护每个状态容易出错“通讯协议优化,尽量减少⼀一次交互中数据往返的次数。”基于版本号的消息协议VersionMessage106msg105msg104msg103msg102msg101msgRedisSortedSet:S:msg-psh C:msg-sync S:msgv101msg S:msgv102msg S:msgv103msg S:msgv104msg C:msg-finv104基于版本号的交互ClientServermsg-pshmsg-sendmsg-syncmsg-sendmsg-sendmsg-finSortedSetBasemsg-send针对弱⺴⽹网络的优化协议 •消息通过版本号维护顺序 •新消息到达,Server只负责push通知 •Client收到轻量的msg-psh后发出同步请求 •Server按照版本号连续发送msg •Client告诉Server收到最后的版本其它问题•核⼼心的⻓长连接只⽤用于传输轻量的实时数据 •图⽚片、语⾳音等都可以开新的TCP或HTTP连接“⼀一切就绪后,最重要的就是监控。”监控–latermoon@qq.com“完”