当前位置:首页 > 短网址资讯 > 正文内容

IM 消息可靠性及一致性的解决方案

www.ft12.com7年前 (2017-08-01)短网址资讯2679

即时聊天(IM)系统需要解决消息可靠性及消息一致性问题。

消息可靠性,简单来说就是不丢消息,会话一方发送消息,消息成功到达对方并正确显示;消息一致性,包括发送一方消息一致及会话双方消息一致,要求消息不重复,不乱序。

消息发送实现过程

消息发送一般的实现过程可以分为两个阶段:发送方发送消息,服务端接收,返回消息 ACK 给发送方;服务端将消息推送到接收方。判断消息发送是否成功主要依据第一阶段,即服务器是否接受到消息,消息状态可以分为三类:正在发送、发送成功、发送失败。其节点分别是:

1. 正在发送:发送方触发发送事件开始,到收到服务端返回消息对应 ACK 之前;

2. 发送成功:发送方收到消息对应 ACK 回复;

3. 发送失败:超过一定重发次数,未收到消息对应 ACK 回复。

消息发送流程图:

消息可靠性

重发机制

保证消息发送第一阶段消息成功发送的方法是设立重发机制,依据一定时长内是否收到消息对应 ACK,判断消息是否要重发,如果超过预设时长,就重新发送。当重发次数超过预设次数,就不再重发,判定该消息发送失败,修改消息发送状态。

会话记录检查

消息发送第二阶段服务端推送消息到接收方,如果连接断开,会丢失消息,所以要保证消息完整,就需要在建立连接后,根据上一条消息(已经 ACK)时间戳,获取会话记录,一次返回一段时间内所有消息。

另一种保证方法是加入定时轮询,检查消息完整性。

建立连接流程图:

两个问题

消息重发、会话记录检查需要考虑两个问题:消息是否会重复发送,消息顺序是否会被打乱。举两个例子:

1. 消息重发,如果丢消息的点在消息达到服务端之前,服务端并没有收到消息,发送方重新发送丢失消息,服务端接收成功,不会产生两条相同消息;而如果服务端接收到消息,返回 ACK 丢失,这时再发送一次相同消息,就可能造成消息重复。

2. 消息顺序,如果发送方连发三条消息,第一、第三条成功被服务端接收,第二条丢了,那第三条消息是否会被记录?如果这时第二条消息达到服务端,其顺序是在第三条时间之前还是之后(服务端一般都会给记录打一个时间戳)?

消息一致性

使用 uuid 消息去重

对于消息重发问题,可以给每条消息增加属性 uuid 作为消息唯一标识,重发消息 uuid 不变,前端根据 uuid 去重。

使用向量时钟进行消息排序

对于消息排序问题,因为在聊天中,消息的顺序对于发送方的表述有重要的影响,消息不完整或顺序颠倒都可能造成语意不连贯,甚至曲解。所以需要保证发送方发送消息顺序,而会话双方消息排序需要考虑实际情况。

在一般的认知里,状态是正在发送的消息,应该还没有被对方看到,只有发送成功的消息,才会被对方看到。但在实现中,消息发送成功是以服务器接收消息并返回 ACK 成功为判断依据,而不是被对方接收到。

那么就会出现这样一个问题,如果一条消息状态是正在发送,此时收到一条消息,那么收到的消息是在正在发送的消息之前还是之后?

这是一个上下文关系,关键问题是发送方是以哪条所见消息为依据发送消息的。

这里提供一种思路,借鉴分布式系统中的向量时钟算法。先简单描述向量时钟算法:

向量时钟算法用于在分布式系统中生成事件偏序关系,并纠正因果关系。一个系统包含 N 个节点,每个节点产生的消息体中包含该节点的逻辑时钟,整体系统的向量时钟由 N 维逻辑时钟组成,并在每个节点产生的消息体中传递。

向量时钟算法的具体实现:

1. 初始状态,向量值为 0;

2. 每次节点处理完节点事件,该节点时钟加一;

3. 每次节点发送消息,将包含自身时钟的系统向量时钟一起发送;

4. 每次节点收到消息,更新系统向量时钟,该节点时钟加一,其他节点对比每个节点本地保留的向量时钟的值和消息体中向量时钟的值,取最大值。

5. 节点同时收到多条消息,判断接收消息的向量时钟之间是否存在偏序关系

1. 如果存在偏序关系,则合并向量时钟,取偏序较大的向量时钟;

2. 如果不存在偏序关系,则不能合并。

  • 偏序关系:如果 A 向量中的每一维都大于等于 B 向量,则 A、B 之间存在偏序关系,否则不存在偏序关系。

对于消息排序,其实就是处理消息的上下文语境,决定消息之间的因果关系。参考向量时钟算法,假设有 N 个消息会话方,系统的向量时钟由 N 维时钟组成,向量时钟在各方发送的消息体中传递,并依据向量时钟排序,具体实现:

1. 系统向量时钟设为 (0, 0, …, N);

2. 节点发送消息,更新系统向量时钟,该节点时钟加一,其他节点不变;

3. 节点接收消息,更新系统向量时钟,该节点时钟加一;其他节点对比每个节点本地保留的向量时钟的值和消息中向量时钟的值,取最大值。

4. 依据消息体内系统向量时钟的偏序关系决定消息顺序:

1. 如果可以确定偏序关系,则根据偏序关系由小到大显示;

2. 如果多条消息不能确定偏序关系,则按照自然顺序(接收到的顺序)显示。

向量时钟在理论上可以解决大部分消息一致性的问题,但在实现中还需要考虑实际使用时的体验,这其中最需要关注的问题是:是否要强制排序,或者说,如果实际显示顺序和向量时钟之间的偏序关系不一致,是否要移动消息之间的顺序。

举个例子,在一个有多人的会话中,如果有一方网速特别慢,收不到消息,也发不出消息。在他看到的最后的消息之后,其他人已经开始新的话题,这时他关于上一个话题的消息终于发送成功,并被其他人收到,此时就存在这样一个问题:

这条关于上一个话题的消息是显示在最后,还是移到较早时间?如果显示在最后,但消息内容和目前的话题不相关,其他人可能会感到莫名其妙;如果把消息移到较早时间,那么这条消息可能不会被其他人看到,或者看到前面多了一条消息,会有种突兀的感觉。

IM 的场景很多,也很复杂,更多的时候需要从产品角度考虑问题。对于消息是否需要排序的问题,这里只提出一个比较通用的方案:建议会话中不强制排序,会话历史记录中按照向量时钟的偏序关系进行排序。

小结

对于 IM 系统消息可靠性及一致性问题,通过消息重发机制保证消息成功被服务端接收,通过会话记录检查保证收取消息完整,从而保证整个消息发送过程的可靠性;使用 uuid 消息去重,参考向量时钟算法进行消息排序,为保证消息一致性提供一种解决方案。

扫描二维码推送至手机访问。

版权声明:本文由短链接发布,如需转载请注明出处。

本文链接:https://www.ft12.com/article_368.html

分享给朋友:

相关文章

短网址数据库InnoDB的快照读,到底和什么相关?

InnoDB是非常适合短网址业务的存储引擎,其多版本并发控制(Multi Version Concurrency Control, MVCC),快照读(Snapshot Read)机制,能够通过读取回滚段(rollback segment)...

消费者变成“智”人,供应链要变成“人工”智能

消费者变成“智”人,供应链要变成“人工”智能

[ ft12短网址导读 ] 智能供应链包含:①智能预测;②智能商品;③智能定价;④智能库存;⑤科学地分配订单生产路径及快递安排;⑥基于模式识别等技术的风险控制系统,及时预警订单的风险级别等。图片来自“123rf.com.cn”【编...

FT12短网址:网站被降权怎么办 如何恢复权重?

FT12短网址:网站被降权怎么办 如何恢复权重?

尽管baidu一再强调百度本身并没有权重一说,可是关于各位站长兄弟来说,权重仍是衡量一个网站的主要指标之一。一个网站的权重高,代表流量高,录入好,关键字排行也相对较好。那么,这么主要的指标,一旦不稳定了,被降权了怎么办呢?笔者从前运营过一个...

处理好自己与身边人的关系,只要记住三句话

处理好自己与身边人的关系,只要记住三句话

(图文综合自网络)很多时候,人们往往善于忘记别人对自己的好处。而一旦出现无心的冒犯,却总是耿耿于怀,变成了话不投机半句多,甚至老死不相往来。想想我们身边是否有这样的事例?人是社会动物,每个人都不可避免地要与人交往。要想过得愉快,就要处理好自...

50个吸引女性粉丝的引流内容平台分析

50个吸引女性粉丝的引流内容平台分析

本文通过对各内容平台的数据分析和挖掘,展现中国女性网民的网络生活,并以此为基础来为研究女性粉丝流量。 同时,本报告还结合了平台运营要求、变现方式和引流难度等维度,来体现平台的价值。希望这份报告能帮助新媒体从业者们从多角度了解内容平台,更深入...

苹果撑不起无人驾驶汽车梦,转而向基础技术发展

苹果撑不起无人驾驶汽车梦,转而向基础技术发展

[ FT12短网址 ] 进入2017年后,苹果公司无人驾驶汽车的步伐有所放缓。苹果公司已经推迟了任何创造苹果自有品牌无人驾驶汽车的打算,反而致力于能让汽车自动驾驶的基础技术。图片来自于网络几年前,当新员工被带入参与苹果公司打造无人...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。