“消息收发” 是 IM 系统最最核心的业务逻辑模块,本篇文章是整个 “分层架构 IM 系统” 的核心!
IM,即 “即时通讯”,要求消息具备 “及时性” 和 “可靠性”:
及时性,要求消息的收发需要很低的延时,在线双方通过消息交流时,没有明显的滞后感。
可靠性,要求消息不能丢失;对于消息发送方来说,只要消息发送成功了,消息就会一直存在服务端,不会丢失(除非因产品策略,删除久远的历史消息);对于服务端来说,只要接收方在线,一定会把消息送达到接收方,如果接收方不在线,会通过其他通道来触达和通知到接收方用户,体现出 “即时通讯” 的优势 。
在 IM 单体架构中,我们分析过客户端不断对服务端进行轮询获取消息的方式(单体架构 IM 系统之核心业务功能实现),这种方式我们称之为 “信箱模型”; 信箱模型虽然实现比较简单,但是消息的及时性不好,因为存在大量的无效请求,会造成服务端的资源浪费和负载,信箱模型比较适合用户规模比较小的场景,不适合分层架构的 IM 系统。
分层架构的 IM 系统,通常基于服务端直接推送的方式实现消息从服务端到客户端的传输,见下图。
客户端 A 发送消息到服务端后,服务端直接将消息推送到客户端 B,就好像服务端知道客户端 B 的电话号码一样,可以直接联系到客户端 B,我们把这样的消息推送模型叫做 “电话模型”,这里的 “电话” 往往就是 长连接。
分层架构 IM 系统的消息收发流程,为了做到 “及时性” 和 “可靠性”,我们划分为三个阶段:生产消息阶段、推送消息阶段,确