分类: 云计算
2022-10-20 10:02:45
无论是IM消息通信系统还是客户消息系统,其本质都是一套消息发送与投递系统,或者说是一套网络通信系统,其本质两个词:存储与转发。
根据个人理解,其应有的feature如下
A 整个系统中Server端提供存储转发能力,无论整体架构是B/S还是C/S;
E 每条消息都有生命周期,如一天,且有长度限制如1440B【尽量不要超过一个frame的size】,只考虑在线消息的处理,无论是超时的消息还是超出系统承载能力的消息[如键盘狂人或者键盘狂机器人发出的消息]都被认为是"垃圾消息";
F 为简单起见,不给消息很多类型,如个人对个人消息,群消息,讨论组消息等,都认为是一种群[下文用channel替代之,也有人用Room这个词]消息类型;
G 为简单起见,这个群的建立与销毁流程本文不述及,也即消息流程开始的时候各个消息群都已经组建完毕,且流程中没有成员的增减;
H 账户申请、用户鉴权和天朝独有的黄反词检查等IM安全层等暂不考虑。
系统名词解释
1 PC: 单机型客户端,如windows端和mac端等等;在介绍消息发送流程之前,先介绍一些基本概念。
一个消息系统,从宏观上来说,就是一个PUB/SUB系统,有消息生成者publisher[or producer],有消息中转者broker,有消息处理者msg server,以及消息消费者subscriber[or consumer]。消息消费者可以是一个人,也可以是一群人,在pub/sub系统之中producer&consumer一起构成了一个channel,或者称之为room,或者称之为group。
无论是producer还是consumer,每个具体单位都要由系统分配给一个id,称之为UIN[名词来源于icq]。
那么还有一个问题,如果用户修改了手机的本地时间怎么办?那就换做另一个参数:本地手机时钟累计运行时长,手机出厂后其运行累计时长只会一直增加不会减小。
这个流程牵涉到一个比较重要的模块:Counter,这个模块其实都可以用Redis充当,怎么做你自己想^ _ ^。这个模块自身的实现就是一个分布式的计数器,直接使用Redis也没什么问题,但是{BANNED}最佳好的方法是采用消息id批发器的方式,msg chat server到Counter每次批发一批id回来,然后分配给每个msg,当使用完毕的时候再接着去Counter申请一批回来,以减轻Counter的压力,具体的设计请参考专利《即时消息的处理方法和装置》[参考文档9]。
上面还有一个概念未叙述到:发送端的消息邮箱{有人称为消息盒子,或者某大厂称之为客户端消息db},它存储了所有本地发送出去的消息,其中没有服务端分配的msg id的消息都被认为是发送失败的消息,待用户主动尝试发送或者网络环境重新稳定后可以有客户端尝试重新发送流程。
用户查看消息邮箱中的本地历史消息的时候,就要依据msg id把消息排序好展现给用户。至于用户发送过程中看到的消息可以认为是本地消息的一个cache,每个channel{BANNED}最佳多给他展现100条,这100条消息的排序要依照每条消息的发出时间或者是消息的接收时间[这个接收到的消息时间以消息到达本机时的本地时钟为依据]。当用户要查看超出数目如100条消息之外的消息,客户端要引导用户去走历史消息查看流程。