我们都知道,一个典型的分布式系统中,很多业务场景都需要考虑消息投递的时序,例如:
IM中单聊消息投递:保证发送方发送顺序与接收方展现顺序一致;
IM中群聊消息投递:保证所有接收方展现顺序一致;
电商充值支付消息:保证同一个用户发起的请求在服务端执行序列一致。
实时消息时序和一致性是分布式系统架构设计中非常难的问题(尤其IM应用这种以消息为中心的应用形态),困难在哪?有什么常见优化实践?这就是本文要讨论的内容。

凭什么说保证即时消息的时序、一致性很困难?
为什么分布式环境下,即时消息的时序难以保证,这边简要分析了几点原因:
分布式环境下,有多个客户端、有web集群、service集群、db集群,他们都分布在不同的机器上,机器之间都是使用的本地时钟,而没有一个所谓的“全局时钟”,所以不能用“本地时间”来完全决定消息的时序。
多服务器不能用“本地时间”进行比较,假设只有一个接收方,能否用接收方本地时间表示时序呢?遗憾的是,由于多个客户端的存在,即使是一台服务器的本地时间,也无法表示“绝对时序”。
多发送方不能保证时序,假设只有一个发送方,能否用发送方的本地时间表示时序呢?遗憾的是,由于多个接收方的存在,无法用发送方的本地时间,表示“绝对时序”。
多发送方与多接收方都难以保证绝对时序,假设只有单一的发送方与单一的接收方,能否保证消息的绝对时序呢?结论是悲观的,由于网络传输与多线程的存在,仍然不行。
通过上面的分析,假设只有一个发送方,一个接收方,上下游连接只有一条连接池,通过阻塞的方式通讯,难道不能保证先发出的消息msg1先处理么?
答案是:可以,但吞吐量会非常低,而且单发送方单接收方单连接池的假设不太成立,高并发高可用的架构不

本文探讨了在分布式系统中,尤其是在IM即时通讯开发中,如何保证消息的时序性和一致性。分析了消息时序难以保证的原因,并提出了一些生产环境下的优化方法,如利用客户端或服务端时间作为时序标准,使用单调递增ID确保长时间趋势的时序一致,以及在IM群聊中采用群内消息有序的策略。
最低0.47元/天 解锁文章
1022

被折叠的 条评论
为什么被折叠?



