请选择 进入手机版 | 继续访问电脑版

默认
发表评论 1
一个低成本确保IM消息时序的方法探讨

本文原题为“低成本确保消息时序的方法”,来自IM技术交流群群友:封宇,感谢原作者(原文链接见文末)。


1、前言


IM类系统中,都需要考虑消息时序问题,如果后发送的消息先显示,可能严重扰乱聊天消息所要表达的意义。

IM系统中主要有两类消息:

  • 单聊消息:两个人之间的聊天,需要确保发送方和接收方消息时序展示一致;
  • 群聊消息:一群人在一起聊天,需要确保所有接收方消息顺序一致。

消息时序是分布式系统架构设计中非常难的问题,一个分布式的IM系统必须要解决这个问题。另一篇文章《如何保证IM实时消息的“时序性”与“一致性”?》更多详细地探讨了消息时序的问题,有兴趣的可以深入看看。作者的另一篇文章《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》也值得一看。

2、为什么会出现时序问题


1时间不一致导致


IM系统存在大量的客户端、IM服务器集群、长连接接入层集群、短连接接入层集群、数据库集群,这些应用分布在不同的机器上,时间很可能不一致,时区也可能不一致。

2网络传输导致


网络传输延迟不同。同一用户后发送的消息可能早与先发送的消息到达服务器;不同用户的发送的消息到达服务器的延时差异可能更大。如下图,msg1先发送,msg2后发送。由于网络原因,可能msg2先到达消息服务器:

1.jpg

3服务集群时差导致


由于IM服务器分布式部署,不同的消息可能路由到不同的逻辑层处理。路由到不同logic的时延不同(尤其是跨机房),且不同logic之间存在微量时差。见下图所示。

2.jpg

4消息处理速度不一致导致


服务器收到消息后,不同logic,不同线程对消息的处理速度可能不同,导致投递消息的时序出现错乱。

3、低成本解决办法探讨


以下内容是成本较低的解决办法,在产品快速开发迭代的场景下能够求得质量和效率的平衡。

1时间同步


确保服务器端各个服务器之间通过NTP协议实现时间同步,确保各个操作系统时区一致。NTP协议基本可以保证各个服务器的时间误差在毫秒级,并且在误差较大时能够出发报警(感谢运维团队)。

2单聊时序


单聊消息可能出现时序问题如下图:

3.jpg

用户1发送消息时,确保每条消息的seq号递增(如果系统重装,需要客户端将seq写成文件保存,重装后能够继续seq递增)。

消息发送到服务器后,因为网络及分布式原因,可能造成服务器接收消息时序错乱
服务器推送消息给用户2,可能因为网络原因再次出现时序错乱。用户2,需要根据seq对消息显示时序进行修正。

注:对于seq归0的情况(比如,记录seq的文件被删除),用户2需要结合timestamp时间及seq,共同判断消息时序。

3群聊消息


群聊不能再利用发送方的seq来保证时序,因为发送方不单点,时间也不一致。群聊消息以服务器收到发送消息的顺序为准,服务器为每条消息生成时间有序的msgid,客户端以msgid大小顺序来排序即可。

以上是生产环境中的一些实践,该方法在较低成本下,确保了消息时序的一致性。

(原文链接:点此进入

4、更多IM开发综合资料


新手入门一篇就够:从零开发移动端IM
移动端IM开发需要面对的技术问题
开发IM是自己设计协议用字节流好还是字符流好?
请问有人知道语音留言聊天的主流实现方式吗?
IM消息送达保证机制实现(一):保证在线实时消息的可靠投递
IM消息送达保证机制实现(二):保证离线消息的可靠投递
如何保证IM实时消息的“时序性”与“一致性”?
一个低成本确保IM消息时序的方法探讨
IM单聊和群聊中的在线状态同步应该用“推”还是“拉”?
IM群聊消息如此复杂,如何保证不丢不重?
谈谈移动端 IM 开发中登录请求的优化
移动端IM登录时拉取数据如何作到省流量?
完全自已开发的IM该如何设计“失败重试”机制?
通俗易懂:基于集群的移动端IM接入层负载均衡方案分享
微信对网络影响的技术试验及分析(论文全文)
即时通讯系统的原理、技术和应用(技术论文)
开源IM工程“蘑菇街TeamTalk”的现状:一场有始无终的开源秀
腾讯原创分享(一):如何大幅提升移动网络下手机QQ的图片传输速度和成功率
如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
>> 更多同类文章 ……

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:请问服务端的login和dataserver通讯是用同步还是异步啊?下一篇:浅谈移动端IM的多点登陆和消息漫游原理

本帖已收录至以下技术专辑

评论 1
保证时序难度有点大...
签名: 该会员没有填写今日想说内容.

Processed in 0.156250 second(s), 38 queries , Gzip On.

返回顶部