即时通讯(IM)系统最基础、最重要的是消息的及时性与准确性,及时体现在延迟,准确则具体表现为不丢、不重、不乱序。
综合考虑业务场景、系统复杂度、网络流量、终端能耗等,我们的亿级分布式IM消息系统精心设计了消息收发机制,并不断打磨优化,形成了现在的消息可靠投递机制。
整体思路就是:
1)客户端、服务端共同配合,互相补充;
2)采用多重机制,从不同层面保障;
3)拆分上下行,分别处理。
一个完整的IM消息交互逻辑,通常会为两段:
1)消息上行段:即由消息发送者通过IM实时通道发送给服务端;
2)消息下行段:由服务端按照一定的策略送达给最终的消息接收人。
消息上行段主要就是依赖IM的实时通道将消息传递给服务端。
这个阶段的消息可靠投递,需要从协议层进行保证,协议层需要提供可靠、有序的双向字节流传输,我们是通过自研的通信协议 RMTP(即 RongCloud Message Transfer Protocol)实现的。
客户端与服务端之间使用长连接,基于 RMTP 协议传输数据。
经过总结,消息下行段主要有三种行为。
1)客户端主动拉取消息,主动拉取有两个触发方式:
①