一IM电竞个低成本确保IM消息时序的方法探讨
栏目:im资讯 发布时间:2022-12-26 23:52:10

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

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

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

  《IM消息送达保证机制实现(一):保证在线实时消息的可靠投递》《IM消息送达保证机制实现(二):保证离线消息的可靠投递》《如何保证IM实时消息的“时序性”与“一致性”?》《IM单聊和群聊中的在线状态同步应该用“推”还是“拉”?》《IM群聊消息如此复杂,如何保证不丢不重?》《一种Android端IM智能心跳算法的设计与实现探讨(含样例代码)》《移动端IM登录时拉取数据如何作到省流量?》《通俗易懂:基于集群的移动端IM接入层负载均衡方案分享》《浅谈移动端IM的多点登陆和消息漫游原理》《IM开发基础知识补课(一):正确理解前置HTTP SSO单点登陆接口的原理》《IM开发基础知识补课(二):如何设计大量图片文件的服务端存储架构?》《IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议》《IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token》《IM群聊消息的已读回执功能该怎么实现?》《IM群聊消息究竟是存1份(即扩散读)还是存多份(即扩散写)?》《IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列》《一个低成本确保IM消息时序的方法探讨》(本文)《IM电竞IM开发基础知识补课(六):数据库用NoSQL还是SQL?读这篇就够了!》《IM里“附近的人”功能实现原理是什么?如何高效率地实现它?》《IM开发基础知识补课(七):主流移动端账号登录方式的原理及设计思路》《IM开发基础知识补课(八):史上最通俗,彻底搞懂字符乱码问题的本质》《IM的扫码登功能如何实现?一文搞懂主流应用的扫码登陆技术原理》《IM要做手机扫码登陆?先看看微信的扫码登录功能技术原理》《IM开发基础知识补课(九):想开发IM集群?先搞懂什么是RPC!》《IM开发实战干货:我是如何解决大量离线聊天消息导致客户端卡顿的》《IM开发干货分享:如何优雅的实现大量离线消息的可靠投递》

  《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》《即时通讯安全篇(七):用JWT技术解决IM系统Socket长连接的身份认证痛点》《移动端IM中大规模群消息的推送如何保证效率、实时性?》《一个低成本确保IM消息时序的方法探讨》《从零开始搭建瓜子二手车IM系统(PPT) [附件下载]》《瓜子IM智能客服系统的数据架构设计(PPT) [附件下载]》《瓜子IM智能客服系统的数据架构设计(整理自现场演讲,有配套PPT)》

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

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

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

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

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

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

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

  消息发送到服务器后,因为网络及分布式原因,可能造成服务器接收消息时序错乱

  服务器推送消息给用户2,可能因为网络原因再次出现时序错乱。用户2,需要根据seq对消息显示时序进行修正。

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

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

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

  《腾讯原创分享(一):如何大幅提升移动网络下手机QQ的图片传输速度和成功率》

  实时推送、IM等即时通讯相关技术的学习、交流与分享的平台。专业的资料、专业的人、专业的社区!让即时通讯技术能更好传播与分享。