一致性设计在分布式系统中是一个重要问题。若是一个系统同时使用多个子数据系统来存储与读取数据,就必须设计知足功能需求的一致性定义。若是系统对不一样数据子系统进行操做的结果不一致,不但可能会使用户困惑,更可能引起更严重的数据问题或系统错误。一致性有多种级别,适用于不一样的业务场景。对于金融等对数据一致性要求较高的行业,传统的事务能够提供较高的一致性保证。对于分布式系统等对性能(performance)和可用性(availability)要求较高的场景,牺牲必定的强一致性来换取更好的用户体验也可接受。git
在以前写过一次关于TCC事务的笔记,也了解了分布式事务产生的缘由,以及部分解决方案,此次一块儿跟你们总结下最终一致性方案设计思路的相关内容;github
消息发送一致性的概念:是指产生消息的业务动做与消息发送的一致。数据库
也就是说,若是业务操做成功,那么由这个业务操做所产生的消息必定要成功投递出去,不然就丢消息
最终一致性可使用在相似以下功能场景当中:segmentfault
也就是说:采用最终一致性的数据系统一般不要求数据操做失败时执行回滚(rollback)。用户或系统日志将得知操做失败,但在另外一次成功的操做以前,数据的不一致问题并不会被自动修复。并发
ps:确定会有小伙伴有疑问,我执行程序的时候代码报错了致使最终一致性的方案不成功怎么办???小朋友你是否是有不少???若是是代码报错,自己说明了你的业务代码有问题,而不是最终一致性方案的锅~~。异步
最终一致性能够借助消息中间件,消息队列等工具实现,须要根据本身的业务去定制不一样的技术方案;分布式
我们要介绍的是基于RabbitMq实现的一个可靠消息服务系统来完成事务的执行,具体流程以下图:工具
消息中间件返回消息持久化结果(成功/失败),主动方应用根据返回结果进行判断如何进行业务操做处理:性能
消息中间件收到业务操做结果后,根据业务结果进行处理;学习
除了以上几个流程,消息系统还应该提供ackMsg消息确认服务、消息状态查询服务。
是最重要的一个子系统,它接收并存储预发送的消息,并提供进一步的确认功能。通常须要实现如下接口服务。
提供一个可视化的管理界面,对可靠消息服务系统中的数据,进行查询和管理。好比可查看已死亡的消息,可经过界面手工重发等
提供对异常状况的处理。当消息服务子系统收到并保存预发送消息,但因异常状况,没有收到确认发送消息时,这种消息不可能一直留存在数据库中。这种状况的数据,就须要消息状态确认子系统按期捞取这些待确认超时的数据,去调用主动方应用系统中的业务查询接口进行核对确认。根据核对结果决定是发送消息仍是删除数据。
若是消息数据已经接收到业务确认,这种通过业务确认的消息,就必定要发送到MQ,并被消费方成功消费,毫不能丢。消息恢复子系统按期捞取那些状态是“发送中”,而没有被消费确认的超时消息,进行从新发送。
消费方监听程序,接收MQ消息,成功处理后调用消息服务子系统的接口,确认消息已被成功消费,能够删除。
本文是学习过程当中的笔记整理,若是有不对的地方请你们联系我,及时纠正,避免误导童鞋们,谢谢各位童鞋的耐心观看,但愿本文会帮助到您~后期计划在Hyperf中写一个demo,感兴趣的能够留意个人GitHub。