5

即时通讯协议之陌陌

 2 years ago
source link: https://www.biaodianfu.com/momo.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

放弃使用XMPP

陌陌发展刚开始由于规模小,30-40W的连接数(包括Android后台长连接用户),也使用XMPP;由于XMPP的缺点:

  • 流量大(基于XML)
  • 不可靠(为传统固定网络设计,没有考虑WIFI/2G/3G/地铁/电梯等复杂网络场景),交互复杂(登陆需5-6次,尤其是TLS握手)
  • XMPP丢消息:服务端和客户端处于“半关闭”状态,客户端假连接状态,服务端有收不到回执;
  • Server端连接层和逻辑层代码没有解耦分离,常常重启导致不可用。

陌陌的系统架构

消息中转:

连接层(Connector链接集群)

  • 连接层的作用:只做消息转发
  • 设计原则简单/异步
  • 允许随时重启更新/只允许晚上重启/不允许重启断线
  • 单台压测试连接数70W;现状:5亿用户,月活5000W+,连接数1200W+;

逻辑层(Logic逻辑集群)

  • 用户会话验证

通讯协议设计:

  • 安全性要求
  • 传输要求可靠(不会丢消息)
  • 高效(弱网络快速的收发)

陌陌的通讯协议

常见协议XMPP/SIP,主要缺点:流量大,不可靠,交互复杂

陌陌采用私有通讯协议,目标:

  • 高效,弱网络快速收发
  • 可靠,不会丢消息
  • 参考协议格式:REDIS协议

Redis协议

下面都是用Redis协议来描述逻辑

基于队列的消息协议

基于队列的交互

  • 传统的IM协议
  • 前提是基于网线、WiFI,网络延迟极小
  • 移动网络下,交互及其费时,服务器要维护每个状态容易出错

基于版本号的消息协议

基于版本号的交互

针对弱网络的优化协议

  • 消息通过版本号维护顺序
  • 新消息到达,Server只负责push通知
  • Client收到轻量的msg-psh后发生同步请求
  • Server按照版本号连续发送msg
  • Client告诉Server收到的最后的版本
  • 核心的长连接只用于传输轻量的实时数据,图片、语音等都开新的TCP或HTTP连接
  • 一切就绪后,最重要的就是监控,写一个APP查看所有的运营状态,每天观察
message-statistcs.png

如何选择最优路线智能路由、连接策略:

  • 多端口、双协议支持,应对移动网关代理的端口限制
  • 支持TCP、HTTP两种协议
  • 根据备选IP列表进行并发测速(IP+端口+协议)
  • 后端根据终端连接情况,定时更新终端的备选IP列表
  • 终端在连接空闲时上报测速数据,便于后端决策
  • TCP协议不通,自动切换到http
  • 优先使用最近可用IP
  • 并发测速,根据终端所处的位置下发多组IP、PORT,只用IP,不用域名,手机上的DNS50%不准

参考资料:

没有找到相关文章。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK