精华内容
下载资源
问答
  • 解决分布式事务中强一致性和最终一致性的思想
    2020-12-17 18:20:00

    1.A和B微服务,如果A成功,B失败,此时A回滚为之前的状态,即A和B都失败,此时满足强一致性.
    lcn框架来解决强一致性.
    本地事务执行前会先创建txManage事务组对象.里面存放事务组信息,当B事务执行失败时,本地事务会根据这个事务组信息来判定成功还是失败,失败的话会回滚.

    2.A和B微服务,如果A成功,B失败,此时通过RocketMQ重试,xxl-job等方式进行让B最终也成功,此时满足事务的最终一致性.
    RocketMQ的半消息,消息回查,重试机制,以及xxl-job捞失败的核心参数走相应逻辑,最终人工兜底来保证最终一致性.

    总结:选择哪种思想根据具体的项目性质和业务场景来定.

    更多相关内容
  • 使用RabbitMQ+延迟队列实现分布式事务的最终一致性方案,demo以典型的订单+库存系统为例
  • 本地消息表是最终一致性的方法,之前的实物补偿是一致性方法,其区别可以追溯到CAP理论BASE理论。大白话来说,一致性保证不存在数据不一致的脏时间,最终一致性可能存在脏时间。 消息队列 消息队列实际上是...

    一、单机事务的延伸

    所谓单机事务,可以理解为单体应用和数据库这两个东西之间实现原子操作的一种方式,其核心要求是实现ACID四种特性。
    对于这些特性,有疑问的同学可以看看这篇:聊聊Mysql的事务、Spring中的@Transaction

    单体应用中很好的实现了ACID问题,那么当这个问题延伸到微服务之中的时候呢?首先我们要先明确微服务应用和数据库之间的基本架构。
    在这里插入图片描述
    简单来说,服务与数据库是一对一的,同一个服务不会直接去调用其他服务的数据库,而是通过调用其他服务来操作数据库。这样的架构是当下流行的,符合单一职责的。

    现在再来看事务的问题,我们有个下单操作,需要同时操作订单库和商品库。应该如何保证这个下单操作的事务?

    举个实际的例子来理解这个问题,我们在订单服务开启了事务,在事务中RPC调用了商品服务,成功操作了商品库数据。而此时订单服务继续往下操作自身数据时异常了,回滚本地操作。请问,此时商品库的数据回滚了吗?

    答案显然是没有,订单服务的事务只是针对订单库的,无法影响到RPC调用的商品服务,更无法影响到商品库的数据使其回滚。

    这就是分布式事务所面临的的问题。

    二、九十年代的XA事务

    XA事务是一种用来分布式事务的解决方案,但是它并不是符合上述微服务架构的分布式事务解决方案
    此话怎讲?来看下面这个图。
    在这里插入图片描述
    大家会发现,怎么是单体应用啊?是的,XA事务正是用来解决单客户端,多数据源问题的
    XA事务在九十年代提出,由数据库大家族一起实现,无论是哪种关系型数据库,都去实现XA协议,做到在一个客户端开启事务就等同于在连接的所有数据库开启事务。这就是XA事务的初衷。

    这么看起来,XA好像没什么用,不,它有用,前人栽树后人乘凉,分布式事务框架Seata就利用了XA这一数据库特性实现了Seata框架本身的`XA模式`。
    

    XA事务原理

    XA事务是基于2PC(两阶段提交协议)实现的,它通过XID来统一标识一次事务。

    1. 客户端在一阶段(prepare阶段),对所有数据源发起perpare请求,所有数据源开启自身XA事务、执行sql,并回复客户端自己准备好了。若此时有任何一个数据源未能成功反馈成功,则本次事务将会进入Rollback阶段。
    2. 二阶段(Rollback阶段),在一阶段中,有任何一个数据源回复失败,客户端都会放弃本次操作,并通知其他所有数据源,进行事务回滚操作,本次操作完成。
    3. 二阶段(Commited阶段),在一阶段中,所有数据源都回复成功,客户端就对所有数据源发起Commited,数据源接收到Commited信号,commited本地事务,本次操作完成。

    实际上,上面的客户端官方定义是TM(Transaction Management,TM会在客户端自动管理各个数据源的XA事务)数据源的官方名字是RM(Resource Management)

    XA事务很简单,实际上也存在网络超时、锁资源之类的问题,但是根源上,当下微服务架构它的设计思想不符,我们无法轻易用上它

    那么分布式事务到底该怎么实现呢?

    三、常见的分布式事务方案

    事务补偿

    回想我们之前纠结的问题,订单服务自身回滚了,商品服务却没有回滚,影响了事务的原子性,那么我们在订单服务回滚的时候,手动写一段代码将商品服务的操作回滚是不是也可以?
    这确实是一种常见的手法。也符合要么全部成功、要么全部失败的原则,但是它也存在一些问题。
    缺点: 最令人诟病的是要自定义回滚操作,订单服务RPC调用的远程服务服务越多,要补偿的代码逻辑就越多。

    本地消息表

    本地消息表是ebay提出的解决方案,使用一张消息表来记录本次事务,RPC调用方通过不断轮询消息表来查看是否需要自己做点儿什么。

    需要注意的是

    1. 在订单服务(事务开启方)需要在一个本地事务中进行本地数据操作和消息表操作,保证本地数据操作和消息表操作的原子性。
    2. 订单服务完成数据后,商品服务多久完成此次事务取决于商品服务的轮询时间间隔,也就是说,该方法能保证最后订单库和商品库数据都是对的,但是不能保证现在他们就都是对的。这就是数据的最终一致性。
    3. 我们不考虑商品服务的业务逻辑异常问题,这属于bug。

    本地消息表是最终一致性的方法,之前的实物补偿是强一致性方法,其区别可以追溯到CAP理论和BASE理论。大白话来说,强一致性保证不存在数据不一致的脏时间,最终一致性可能存在脏时间

    消息队列

    消息队列实际上是本地消息表的另一种实现方式,只是将本地消息表的载体替换成了消息队列。

    1. 使用消息队列,我们同样需要保证发送消息和本地数据操作的原子性。这一点可以用事务消息来保证。比如rocketMQ,它的事务消息可以保证从生产者发送到消息最终在Broker落盘的这一系列中间操作都是原子性的。 事务消息细节有兴趣的同学可以直接去了解,这一部分还是蛮多的。
    2. 相较于本地消息表,商品服务(消费者)是被动的接收消息并消费,不再需要不断的轮询本地消息表,这是一个优点。
    3. 我们同样不考虑商品服务的业务逻辑异常问题,这是bug。但是我们要考虑消费者重复消费的问题,这是使用mq的常识。

    四、分布式事务框架Seata

    seata本质上是独立出来一个节点TC(Transaction coordinator,协调者),这个协调者来进行与所有节点的沟通,TM只需要告诉TC自己要开启事务,要提交/回滚事务,剩下的都由协调者来完成,大大减轻了TM和开发者的负担。
    (偷一张Seata官微的原图)在这里插入图片描述

    AT模式

    一阶段(prepare):所有RM解析当前sql,自动生成回滚日志。执行sql,此时数据库相关数据已被改写。
    二阶段(rollback): 所有RM根据之前的回滚日志进行反向sql,将数据库相关数据再改回来。
    二阶段(commit):所有RM清除本次事务无关数据,如回滚日志。

    缺点:解析sql损耗性能、无法保证脏读(AT默认是读未提交,如果设定读已提交会性能直线下降)。

    TCC模式

    AT模式的人工版、也就是我们上面提到的事务补偿。AT模式的回滚是自动通过sql解析出来的反向sql,而TCC模式完全把perpare、rollback、commit三个方法的实现全都交给开发者。
    缺点:脏读问题同上、代码量可能会恶心死人……

    SAGA模式

    seata官方意思是长事务的解决方案,saga模式不再依赖两阶段提交,而是依赖状态机。
    简单来说,事务一旦start,各个RM按照顺序,一个一个执行自己的逻辑,当其中有一个RM执行失败,之前已经执行的RM都需要进行回滚。
    当然,SAGA模式的正向业务逻辑反向回滚逻辑也是开发者自己来写的。

    XA模式

    Seata的XA模式依赖于数据库原生的XA事务,借助Seata自身独有的TC,实现如下架构方式使用XA事务。
    在这里插入图片描述

    展开全文
  • 有关一致性,实践中又可以分为:一致性、单调一致性、最终一致性。 CAP中的C默认就是指:在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)。 1、一致性...

    我们都了解分布式CAP原则,其中的C就是一致性。有关一致性,实践中又可以分为:强一致性、单调一致性、最终一致性。

    CAP中的C默认就是指:在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)。

    1、强一致性(Strong Consistency)

    在任何时刻所有的用户或者进程查询到的都是最近一次成功更新的数据。强一致性是程度最高一致性要求,也是最难实现的。关系型数据库更新操作就是这个案例。

    2, 单调一致性(Monotonic Consistency)

    单调一致性会从读写两个角度有各自的定义。

    单调读一致性

    如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回该值之前的值。(“If a process has seen a particular value for the object any subsequent accesses will never return any previous values”)

    单调写一致性

    系统保证来自同一个进程的写操作顺序执行。(Write operations that must precede other writes are executed before those other writes.)

    3、最终一致性(Eventual Consistency)

    和强一致性相对,在某一时刻用户或者进程查询到的数据可能都不同,但是最终成功更新的数据都会被所有用户或者进程查询到。当前主流的nosql数据库都是采用这种一致性策略。

    额外内容:

    zookeeper的一致性

    我们以官方文档为准:(2019-11-17摘录的)

    ZooKeeper is a high performance, scalable service. Both reads and write operations are designed to be fast, though reads are faster than writes. The reason for this is that in the case of reads, ZooKeeper can serve older data, which in turn is due to ZooKeeper's consistency guarantees:
    
    Sequential Consistency : Updates from a client will be applied in the order that they were sent.
    
    Atomicity : Updates either succeed or fail -- there are no partial results.
    
    Single System Image : A client will see the same view of the service regardless of the server that it connects to.
    
    Reliability : Once an update has been applied, it will persist from that time forward until a client overwrites the update. This guarantee has two corollaries:
    
    If a client gets a successful return code, the update will have been applied. On some failures (communication errors, timeouts, etc) the client will not know if the update has applied or not. We take steps to minimize the failures, but the guarantee is only present with successful return codes. (This is called the monotonicity condition in Paxos.)
    Any updates that are seen by the client, through a read request or successful update, will never be rolled back when recovering from server failures.
    Timeliness : The clients view of the system is guaranteed to be up-to-date within a certain time bound (on the order of tens of seconds). Either system changes will be seen by a client within this bound, or the client will detect a service outage.
    
    Using these consistency guarantees it is easy to build higher level functions such as leader election, barriers, queues, and read/write revocable locks solely at the ZooKeeper client (no additions needed to ZooKeeper). See Recipes and Solutions for more details.
    

    简单总结:zk提供的是单调一致性,最终一致性,不是强一致性。 zk的文档清楚强调了ZooKeeper does not guarantee that at every instance in time, two different clients will have identical views of ZooKeeper data.

    原文链接:https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#ch_zkGuarantees

    mongoDB的一致性

    原文链接:https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/

    mongodb提供单调写一致性。
    Monotonic Writes
    MongoDB provides monotonic write guarantees, by default, for standalone mongod instances and replica set.

    For monotonic writes and sharded clusters, see Causal Consistency.
    Write operations that must precede other writes are executed before those other writes.

    后记:我们实际开发业务分布式系统,必须在强一致性和最终一致性中间进行tradeoff。 根据业务要求,进行取舍。强一致性会增加延时(所有实例和副本进行数据同步)和降低可用性(只要有节点无法完成同步数据, 可用性就有问题)。
    现在很多软件直接提供可配置的一致性,用户可以根据业务要求进行配置。 例如微软的cosmos-db。

    参考:
    1, https://hellokangning.github.io/en/post/consistency-in-distributed-system/
    2,https://docs.microsoft.com/en-us/azure/cosmos-db/consistency-levels
    3, https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/

    展开全文
  • 区别与联系什么是一致性一致性的种类导致一致性出现的原因一致性 与 弱一致性一致性两个要求弱一致性一致性弱一致性举例顺序一致性最终一致性最终一致性的种类 什么是一致性 在分布式系统中,一致性...

    什么是一致性

    在分布式系统中,一致性(Consistency)是指多副本(Replications)问题中的数据一致性。

    一致性的种类

    • 事务一致性
    • 数据一致性

    本文主要讨论数据一致性(事务一致性指ACID)

    导致一致性出现的原因

    • 数据的分布式存储是导致出现一致性的唯一原因

    强一致性 与 弱一致性

    数据一致性的种类

    • 强一致性(线性一致性):即复制是同步的
    • 弱一致性:即复制是异步的

    强一致性两个要求

    • 任何一次读都能读到某个数据的最近一次写的数据。
    • 系统中的所有进程,看到的操作顺序,都和全局时钟下的顺序一致。

    简言之,在任意时刻,所有节点中的数据是一样的。

    弱一致性

    数据更新后,如果能容忍后续的访问只能访问到部分或者全部访问不到,则是弱一致性。

    最终一致性就属于弱一致性。

    强一致性和弱一致性举例

    例如,对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性
    用户更新网站头像,在某个时间点,用户向主库发送更新请求,不久之后主库就收到了请求。在某个时刻,主库又会将数据变更转发给自己的从库。最后,主库通知用户更新成功。

    如果在返回“更新成功”并使新头像对其他用户可见之前,主库需要等待从库的确认,确保从库已经收到写入操作,那么复制是同步的,即强一致性。如果主库写入成功后,不等待从库的响应,直接返回“更新成功”,则复制是异步的,即弱一致性。

    强一致性可以保证从库有与主库一致的数据。如果主库突然宕机,我们仍可以保证数据完整。但如果从库宕机或网络阻塞,主库就无法完成写入操作。

    在实践中,我们通常使一个从库是同步的,而其他的则是异步的。如果这个同步的从库出现问题,则使另一个异步从库同步。这可以确保永远有两个节点拥有完整数据:主库和同步从库。 这种配置称为半同步。

    顺序一致性

    两个要求:

    • 任何一次读都能读到某个数据的最近一次写的数据。
    • 系统的所有进程的顺序一致,而且是合理的。即不需要和全局时钟下的顺序一致,错的话一起错,对的话一起对。(强一致性的要求比顺序一致性更严格)

    顺序一致性参考

    最终一致性

    不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化。

    最终两个字用得很微妙,因为从写入主库到反映至从库之间的延迟,可能仅仅是几分之一秒,也可能是几个小时

    • 简单说,就是在一段时间后,节点间的数据会最终达到一致状态。

    最终一致性的种类

    最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以区分为:

    • 因果一致性(Casual Consistency)。如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程A无因果关系的进程C的访问,遵守一般的最终一致性规则。
    • “读己之所写(read-your-writes)”一致性。当进程A自己更新一个数据项之后,它总是访问到更新过的值,绝不会看到旧值。这是因果一致性模型的一个特例。
    • 会话(Session)一致性。这是上一个模型的实用版本,它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统的保证不会延续到新的会话。
    • 单调(Monotonic)读一致性。如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在那个值之前的值。
    • 单调写一致性。系统保证来自同一个进程的写操作顺序执行。要是系统不能保证这种程度的一致性,就非常难以编程了。
    展开全文
  • 可以分为强一致性、顺序一致性与弱一致性强一致性(Strict Consistency) 系统中的某个数据被成功更新后,后续任何对该数据的读取操作都将得到更新后的值; 也称为:原子一致性(Atomic Consistency)线性一致...
  • 一致性 弱一致性 最终一致性

    千次阅读 2019-10-02 17:58:48
    在足球比赛里,一个球员在一场比赛中进三个球,称之...一致性(Consistency) 可用性(Availability) 分区容忍性(Partition tolerance) CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。因此在进行分...
  • 强一致性、顺序一致性、弱一致性和共识 提到分布式架构就一定绕不开“一致性”问题,而“一致性”其实又包含了数据一致性和事务一致性两种情况,本文主要讨论数据一致性(事务一致性指ACID) 复制是导致出现数据...
  • ZooKeeper能保证任何时刻读到的数据绝对一致吗? Zookeeper的特点就是,分布式,高可用,...也就是说可用性和一致性是Zookeeper的关键特性,作为一个消息的中间商,做了一个可靠的信息传递存储的角色。 但是了解下ZooKeep
  • 最终一致性 是弱一致性的特例,它不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化。简单地说,就是在一段时间后,节点间的数据会最终达到...
  • 一致性,弱一致性,最终一致性 如何区分强弱一致性 如图,现在有用户更新头像这一事件,数据库是一主多从,主库写,从库读,我们这时候就可以通过判断主库是否等待从库写操作成功才向用户返回更新成功来确认是一致性...
  • 在足球比赛里,一个球员在一场比赛中进三个球,称之...一致性(Consistency) 可用性(Availability) 分区容忍性(Partition tolerance) CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。因此在进行...
  • 在分布式系统中会涉及到CAP原理,来保证数据的一致性, 1.什么是CAP: 一致性(Consistency) 可用性(Availability) 分区容忍性(Partition tolerance) CAP原理是说这三个要素最多只能同时满足两点,不可能...
  • CAP原理与最终一致性 一致性 弱一致性 介绍内容转载自:http://www.blogjava.net/hello-yun/archive/2012/04/27/376744.html CAP原理中,有三个要素: 一致性(Consistency) 可用性(Availability) 分区容忍性...
  • 我们最近发起的ServiceComb-Saga项目来解决分布式环境下的数据最终一致性问题。本文将向大家介绍为什么数据一致性如此重要?Saga又是什么?想象一下如果我们经营着一家大型企业,下属有航空公司、租车公司、连锁...
  • 一致性、弱一致性、最终一致性

    千次阅读 2015-09-27 22:01:39
    在足球比赛里,一个球员在一场比赛中进三个球,称之为帽子戏法(Hat-trick)。在分布式数据系统中,也有一个帽子原理(CAP Theorem),不过此帽子非彼帽子。...一致性(Consistency)可用性(Availabil
  • 假设有一个分布式系统,为了实现它的可用性,要对数据进行冗余存储 N 表示数据冗余的份数 W 表示更新数据时需要... HBase 借助底层的 HDFS 来实现数据冗余备份,使用的是 N=W R=1,牺牲可用性来保证强一致性 2、W+R &
  • 一致性包括一致性弱一致性: 弱一致性:可以理解为CAP定律...但是经过一定的时间会达到最终一致性 一致性: 包含线性一致性顺序一致性。 因此一致性不一定是线性一致性,但线性一致性一定是一致性 ...
  • ZooKeeper是强一致性的吗

    多人点赞 2021-05-12 16:21:59
    ZooKeeper是弱一致性,能保证最终一致性。但是也可以支持一致性,需要通过sync()方法与Leader节点同步后可保证当前节点数据与Leader一致。
  • 介绍内容转载自:http://www.blogjava.net/hello-yun/archive/2012/04/27/376744.html https://blog.csdn.net/c289054531/article/details/15337575CAP原理中,有三个要素:一致性(Consistency)可用性(Availability...
  • SOFARaft是一致性还是最终一致性?

    千次阅读 2019-04-30 03:49:12
    C:这里的C指的是强一致性,同一时刻不同的客户端获取到的数据版本都是相同的 A: 可用性,指的是系统会响应客户端的每一个请求 P:分区容忍性,指的是当系统里面某个节点与其他节点通讯切断(导致节点间数据不一致)...
  • rocketmq-demo:最终一致性分布式事务-rocketmq使用
  • 8种方案,保证缓存数据库的最终一致性

    千次阅读 多人点赞 2021-11-23 21:48:47
    由于对数据库以及缓存的整体操作,并不是原子性的,再加上读写并发,究竟什么样的方案可以保证数据库与缓存的一致性呢? 下面介绍8种方案,配合读写时序图,希望你能从其中了解到保证一致性的设计要点。
  • 根据相位一致性能反映灰度变化快慢情况抗干扰能力较的特点,对图像进行相位一致性检测,再根据监测的值确定像素的特性,然后按不同特性采用不同窗口进行匹配,并结合非参量测度灰度值构成复合费用函数值,得到最终...
  • 字典的局部一致性及相干性对于字典学习很重要,然而当前很多字典学习算法都没有考虑到字典间的局部一致性,更没有同时将二者用于字典学习,致使学习到的字典的鉴别力不是特别, 进而使得它们的识别性能不是非常...
  • 一致性(Consistency) 可用性(Availability) 分区容错性(Partition tolerance) 一致性(C):任何一个读操作总是能读取到之前完成的写操作结果,也就是在分布式环境中,多点的数据是一致的; 可用性(A):每一个操作...
  • 在CAP理论中,系统的一致性(C),可用性(A),分区容错性(P)不可同时满足,而可用性分区容错性又是分布式系统必要的,只能牺牲一致性保证系统的最终一致性来保证系统的高可用。 二、传统分布式事务2PC、3P...
  • 分布式数据库学习3-强一致性

    千次阅读 2021-12-22 15:51:58
    如果你想真正得到一些知识,最好过滤一下你的信息,否则你只是在别人的思考中得意着。 获得多少并不取决于读了...分布式中的强一致性其实指的就是 事务一致性和数据一致性 事务一致性 状态一致性(State Consistency.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 599,598
精华内容 239,839
关键字:

强一致性和最终一致性的区别

友情链接: boa.rar