- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
消息“时序”与“一致性”为何这么难?.pdf
消息“时序”与“⼀致性”为何这么难?
分布式系统中,很多业务场景都需要考虑消息投递的时序,例如:
(1)单 消息投递,保证发送⽅发送顺序与接收⽅展现顺序⼀致
(2 )群 消息投递,保证所有接收⽅展现顺序⼀致
(3 )充值⽀付消息,保证同⼀个⽤户发起的请求在服务端执⾏序列⼀致
消息时序是分布式系统架构设计中⾮常难的问题,ta为什么难,有什么常见优化实
践,是本⽂要讨论的问题。
⼀、为什么时序难以保证,消息⼀致性难?
为什么分布式环境下,消息的时序难以保证,这边简要分析了⼏点原因:
【时钟不⼀致】
分布式环境下,有多个客户端、有web集群、service集群、db集群,他们都分布在不
同的机器上,机器之间都是使⽤的本地时钟,⽽没有⼀个所谓的“全局时钟” ,所以不
能⽤“本 时间”来完全决定消息的时序。
【多客户端 (发送⽅)】
多服务器不能⽤“本地时间”进⾏⽐较,假设只有⼀个接收⽅,能否⽤接收⽅本地时间
表⽰时序呢?遗憾的是,由于多个客户端的存在,即使是⼀台服务器的本 时间,也
⽆法表⽰“绝对时序”。
如上图,绝对时序上,APP 1先发出msg 1,APP2后发出msg2 ,都发往服务器web 1,⽹
络传输是不能保证msg 1⼀定先于msg2到达的,所以即使以⼀台服务器web 1的时间为
准,也不能精准描述msg 1与msg2的绝对时序。
【服务集群 (多接收⽅)】
多发送⽅不能保证时序,假设只有⼀个发送⽅,能否⽤发送⽅的本地时间表⽰时序
呢?遗憾的是,由于多个接收⽅的存在,⽆法⽤发送⽅的本 时间,表⽰“绝对时
序”。
如上图,绝对时序上,web 1先发出msg 1,后发出msg2 ,由于⽹络传输及多接收⽅的
存在,⽆法保证msg 1先被接收到先被处理,故也⽆法保证msg 1与msg2的处理时序。
【⽹络传输与多线程】
多发送⽅与多接收⽅都难以保证绝对时序,假设只有单⼀的发送⽅与单⼀的接收⽅,
能否保证消息的绝对时序呢?结论是悲观的,由于⽹络传输与多线程的存在,仍然不
⾏。
如上图,web 1先发出msg 1,后发出msg2 ,即使msg 1先到达 (⽹络传输其实还不能保
证msg 1先到达),由于多线程的存在,也不能保证msg 1先被处理完。
【怎么保证绝对时序】
通过上⾯的分析,假设只有⼀个发送⽅,⼀个接收⽅,上下游连接只有⼀条连接池,
通过阻塞的⽅式通讯,难道不能保证先发出的消息msg 1先处理么?
回答:可以,但吞吐量会⾮常低,⽽且单发送⽅单接收⽅单连接池的假设不太成⽴,
⾼并发⾼可⽤的架构不会允许这样的设计出现。
⼆、优化实践
【以客户端或者服务端的时序为准】
多客户端、多服务端导致“时序”的标准难以界定,需要⼀个标尺来衡量时序的先后顺
序,可以根据业务场景,以客户端或者服务端的时间为准,例如:
(1)邮件展⽰顺序,其实是以客户端发送时间为准的,潜台词是,发送⽅只要将邮
件协议⾥的时间调整为1970年或者2970年,就可以在接收⽅收到邮件后⼀直“置顶”或
者“置底”
(2 )秒杀活动时间判断,肯定得以服务器的时间为准,不可能让客户端修改本地时
间,就能够提前秒杀
【服务端能够⽣成单调递增的id】
这个是⽏庸置疑的,不展开讨论,例如利⽤单点写db 的seq/auto_inc_id肯定能⽣成单调
递增的id ,只是说性能及扩展性会成为潜在瓶颈。对于严格时序的业务场景,可以利
⽤服务器的单调递增id来保证时序。
【⼤部分业务能接受误差不⼤的趋势递增id】
消息发送、帖⼦发布时间、甚⾄秒杀时间都没有这么精准时序的要求:
(1)同1s内发布的 天消息时序乱了
(2 )同1s内发布的帖⼦排序不对
(3 )⽤1s内发起的秒杀,由于服务器多台之间时间有误差,落到A服务器的秒杀成功
了,落到B服务器的秒杀还没开始,业务上也是可以接受的 (⽤户感知不到)
所以,⼤部分业务,长时间趋势递增的时序就能够满⾜业务需求,⾮常短时间的时序
误差⼀定程度上能够接受。
关于绝对递增id ,趋势递增id的⽣成架构,详见⽂章 《细 分布式I ⽣成⽅法》,此
处不展开。
【利⽤单点序列化,可以保证多机相同时序】
数据为了保证⾼可⽤,需要做到进⾏数据冗余,同⼀份数据存储在多个 ⽅,怎么保
证这些数据的修改消息是⼀致的呢?利⽤的就是“单点序列化” :
(1)先在⼀台机器上序列化操作
(2 )再将操作序列分发到所有的机器,以保证多机的操作序列是⼀致的,最终数据
是⼀致的
典型场景⼀:数据库主从同步
数据库
文档评论(0)