我们都知道,一个典型的分布式系统中,很多业务场景都需要考虑消息投递的时序,例如:
IM中单聊消息投递:保证发送方发送顺序与接收方展现顺序一致;
IM中群聊消息投递:保证所有接收方展现顺序一致;
电商充值支付消息:保证同一个用户发起的请求在服务端执行序列一致。
实时消息时序和一致性是分布式系统架构设计中非常难的问题(尤其IM应用这种以消息为中心的应用形态),困难在哪?有什么常见优化实践?这就是本文要讨论的内容。
凭什么说保证即时消息的时序、一致性很困难?
为什么分布式环境下,即时消息的时序难以保证,这边简要分析了几点原因:
分布式环境下,有多个客户端、有web集群、service集群、db集群,他们都分布在不同的机器上,机器之间都是使用的本地时钟,而没有一个所谓的“全局时钟”,所以不能用“本地时间”来完全决定消息的时序。
多服务器不能用“本地时间”进行比较,假设只有一个接收方,能否用接收方本地时间表示时序呢?遗憾的是,由于多个客户端的存在,即使是一台服务器的本地时间,也无法表示“绝对时序”。
多发送方不能保证时序,假设只有一个发送方,能否用发送方的本地时间表示时序呢?遗憾的是,由于多个接收方的存在,无法用发送方的本地时间,表示“