一个IM系统不仅用于微信qq等聊天软件后台,更是经常存在于业务后台架构。比如说直播语音房,电商客服系统等。那么本文来探究一个线上可用性高的IM系统需要考虑哪些因素,以及需要哪一些组件。
一、统一登入系统
用户接入后台服务器,需要进行登录向后台系统表明身份。这个统一登入系统做的事情是为登录成功的用户 分配会话认证,并派发一个socket。为了保持和用户的会话效率,需要维持一个长连接。在网络不稳定或者切换时,也可以充当与客户端重连的角色。这个重连机制一般采用退避算法。有些系统还会实现多通道tcp/udp的channel。这是因为利用udp效率比较高的问题。同时为了规避udp乱序问题,一般发送之后会维持一个已发送消息的队列,这个队列里面保存消息的seqid,这个seqid就是等收到udp回包时进行一一对应。
二、一致性LB负载均衡系统
这个系统是为了做流量的负载均衡,同时保证消息调度到后端同一机房的一致性。因为消息可能存储在机器,或者说这是有状态的服务。所以需要做消息的一致性。
三、消息合法性校验系统
这个系统检查 是否违反能发送这个消息的理由。比如说双方不是好友关系的可能不能发,消息有敏感词,消息的对方黑名单系统,消息的频次控制。同时对于实时消息可能会做些消息旁路,以便审核系统检查。
四、消息去重系统
这个系统会对网络上的消息包进行检测重复,这些重复可能是网络上tcp的一些不可靠因素或者重试发送带来的,检测重复的机制是保存历史的消息,同时为了减轻存储压力,一般会对这种存储做个有效期自然消亡。
五、消息存储系统
消息服务端存储一个主要动机是对方可能是离线状态,或者是对方上线,但是可能拉取不成功,需要重复拉取。所以这个消息存储有个队列,至少要等接收放完全拉取时,并回复ACK,才能从消息队列中删除消息。
对于不丢失高可靠的要求,消息存储可能还需要做双写。
六、从统一接入系统拉取消息
拉取消息是后台通知客户端过来拉取,客户端也是从统一接入系统拉取,这根客户端发送消息出去用的是同一个接入系统。
七、后台消息的路由
后台消息会对进行一些分类,以便做机房的流量管控,比如说按业务id、按话题等等。
八、消息分布式序列生成器
消息是唯一且递增的号段。每个消息需要从一个分布式号段生成器系统拿到一个seqid。这个号段一般也有个步长。这个号段也可以批发给取号业务方,号段的划分也简单归属进行机器的划分。
九、业务多功能模块
IM系统的接口不止包括拉实际消息,还有比如拉取未读消息数量等等。
十、离线push系统
在线消息通过接入系统发给用户,但是离线消息只能通过push通道传输,比如说apns,gpm/fpm,华为小米OV魅族的第三方push通道。
十一、统计消息模块
对消息进行监控,比如说已读取和未读取消息的状态等等。
十二、用户读消息偏移指针的记录模块
需要记录用户当前已读的seq,以便后面发送相应的未读消息给用户。