聊聊分布式事务一致性与本地消息表

聊聊,分布式,事务,一致性,本地,消息 · 浏览次数 : 230

小编点评

**分布式事务一致性大白话** 分布式事务一致性问题是指多个数据库事务如何实现一致性问题。由于分布式系统的特点,一个事务可能需要在多个数据库节点上执行,因此保证其一致性变得更加困难。 为了解决这一问题,许多数据库系统采用本地消息表模式来实现分布式事务一致性。本地消息表模式是一种将多个数据库消息表拆分到多个数据库节点上,并在每个节点上维护一个独立的消息表的方式。 ** benefits of using a distributed message table:** * **Transaction consistency:** Local message tables provide a mechanism for maintaining transaction consistency by ensuring that all participating nodes are in sync with each other. * **Handling message loss and duplicates:** By using a distributed message table, you can handle message loss and duplicate messages, which can occur in distributed systems. * **Improved performance:** Local message tables can be deployed in a distributed fashion, which can improve performance by reducing network traffic. ** CAP principles:** The CAP principle stands for **Consistency, Availability, and Partition tolerance**. It states that a distributed system must satisfy at least two of these principles to be consistent. * **Consistency (C)** ensures that all nodes in the system have the same view of the data. * **Availability (A)** ensures that the system can continue to operate even if some nodes fail. * **Partition tolerance (P)** ensures that the system can handle failures in a distributed fashion. ** Base theory:** BASE stands for **Basically Available, Soft state, and Eventually consistent**. BASE theory is a framework for describing distributed system consistency. * **Basically Available (AP)** ensures that the system is eventually consistent, meaning that it will eventually reach a consistent state after a failure. * **Soft state (Soft)** describes a state where the system is available but not consistent. * **Eventually consistent (EC)** describes a state where the system eventually reaches a consistent state, but it may take a long time. ** Conclusion:** Local message table mode is a popular approach for implementing distributed transaction consistency. It offers several benefits, including transaction consistency, handling message loss and duplicates, and improved performance. However, it's important to note that local message table mode may not be suitable for all use cases.

正文

我个人比较推崇本地消息表模式来实现最终一致性。首先本地消息表的设计不仅可以解决事务一致性的问题,对于消息队列常见问题中的消息丢失与消息幂等其实都是可以通过本地消息表来解决;其带来的好处是多重的。

什么是分布式事务一致性

大白话就是对数据源进行拆分后,多库多机器的多数据库事务一致性问题。因为此时你的系统可能不是分布式的(当然这不满足分布式的概念),我想表达的是事务的一致性其实就是多机器多库下的数据事务一致性问题。
不管是计算机还是数学行业等,某些问题的解决都是基于理论科学来的,所以我们这行的顶级职称有计算机科学家这类的头衔。分布式事务的解决依赖CAP原则与BASE理论。

CAP

CAP理论描述了分布式系统中的基本原则,其中C是指Consistency(一致性),A是指Availability(可用性)和P是指Partition tolerance(区分容错性)。CAP原则指CAP三者不能同时满足,要么能同时满足CP即同时满足区分容错性和一致性,要么同时满足AP即同时满足区分容错性和可用性。从中可以看出,P是分布式系统的基础,没有区分容错性就谈不上分布式系统了。

CAP只能满足AP或CP的原因是,分布式节点之间通常存在一个数据拷贝的过程,在这一个过程中是只能满足AP或者CP的。举个例子好了,比如redis分布式集群中,当一个写请求打到一个主节点上,几乎同时另一个读请求打到redis这个主节点的对应从节点上,此时请问该从节点能返回刚才写在主节点的数据吗?若要保证CP,此时数据正在从主节点复制到从节点的路上,此时该节点的该数据是不可用的;若要保证AP,因为数据正在从主节点复制到从节点的路上,因此节点间的数据状态是不一致的。

BASE理论

前面讲到分布式系统的CAP原则要么同时满足AP要么同时满足CP,那么BASE理论则是CAP原则权衡的结果。BASE是指Basically Available(基本可用的),Soft state(软状态),Eventual consistency(最终一致性)。

Basically Available是指在分布式集群节点中,若某个节点宕机,或者在数据在节点间复制的过程中,只有部分数据不可用,但不影响整个系统的整体的可用性。

Soft state是指软状态即这个状态只是一个中间状态,允许数据在节点集群间操作过程中存在存在一个时延,这个中间状态最终会转化为最终状态。

Eventual consistency是指数据在分布式集群节点间操作过程中存在时延,与ACID相反,最终一致性不是强一致性,在经过一定时间后,分布式集群节点间的数据拷贝能达到最终一致的状态。

分布式事务一致性

说到分布式事务一致性,就离不开2PC与3PC理论。暂时不展开描述。先说说一致性的类型。

  • 强一致性
  • 弱一致性
  • 最终一致性

强一致性解决方案

基于2PC与3PC实现的XA模式,比如Seata中XA模式的实现

最终一致性

  • 本地消息表
  • saga
  • tcc
  • at(seata框架独有)

什么是本地消息表模式

本地消息表方案最初是ebay提出的,其实也是BASE理论的应用,属于可靠消息最终一致性的范畴。其概念图如下:
image

这里是拆分出来了多个本地消息表,看自己的业务。如果规模比较小,可以只创建一个本地消息表。但业务比较大的时候,我个人是推崇这种模式,因为解耦,业务的发起方。只处理新建、已发送状态的消息;业务的消息方,只处理已接收、已处理状态的消息。

具体怎么做呢?消息生产方(也就是发起方),需要额外建一个消息表,并记录消息发送状态。消息表和业务数据要在一个事务里提交,也就是说他们要在一个数据库里面。然后消息会经过MQ发送到消息的消费方。如果消息发送失败,会进行重试发送。

消息消费方(也就是发起方的依赖方),需要处理这个消息,并完成自己的业务逻辑。此时如果本地事务处理成功,表明已经处理成功了,如果处理失败,那么就会重试执行。如果是业务上面的失败,可以给生产方发送一个业务补偿消息,通知生产方进行回滚等操作。

生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息再发送一遍。如果有靠谱的自动对账补账逻辑,这种方案还是非常实用的。

消息的丢失与幂等

消息队列的引入可以实现业务的异步与解耦,以及流量削峰。尤其是前两者,我在之前的项目中用到了,反正我很爽。但是没有银弹。消息队列的引入会带来一定的问题,其中最常见的就是消息的丢失与幂等!

消息幂等

image

消息丢失

image

总结

如上,引入一个中间的本地消息表,除了解决事务的一致性外,同样可以解决消息的丢失与幂等性问题,一举多得。而且从业务的健壮性与数据一致性来看,一般都会增加一个补偿机制,我在之前的项目中就强力推行补偿机制。本地消息表模式就是补充机制的最直观方式。

与聊聊分布式事务一致性与本地消息表相似的内容:

聊聊分布式事务一致性与本地消息表

我个人比较推崇本地消息表模式来实现最终一致性。首先本地消息表的设计不仅可以解决事务一致性的问题,对于消息队列常见问题中的消息丢失与消息幂等其实都是可以通过本地消息表来解决;其带来的好处是多重的。 ### 什么是分布式事务一致性 大白话就是对数据源进行拆分后,多库多机器的多数据库事务一致性问题。因为此

聊聊分布式解决方案Saga模式

### Saga模式 Saga模式使用一系列本地事务来提供事务管理,而一个本地事务对应一个Saga参与者,在Saga流程里面每一个本地事务只操作本地数据库,然后通过消息或事件来触发下一个本地事务,如果其中一个本地事务失败了,Saga就会执行一系列补偿事务来实现回滚操作。(补偿事务简单来讲就是对之前本

聊聊JDK1.0到JDK20的那些事儿

最近小组在开展读书角活动,我们小组选的是《深入理解JVM虚拟机》,相信这本书对于各位程序猿们都不陌生,我也是之前在学校准备面试期间大致读过一遍,emm时隔多日,对里面的知识也就模糊了。这次开始的时候从前面的JDK发展史和JVM虚拟机家族着手,之前都是粗略读过,这次通过查阅相关资料并收集在每一个JDK版本演化期间所发生的的一些趣闻,发现还是比较有意思的,以下是关于有关JDK发展史的总结分享。

记一次 .NET 某娱乐聊天流平台 CPU 爆高分析

一:背景 1.讲故事 前段时间有位朋友加微信,说他的程序直接 CPU=100%,每次只能手工介入重启,让我帮忙看下到底怎么回事,哈哈,这种CPU打满的事故,程序员压力会非常大, 我让朋友在 CPU 高的时候抓 2 个 dump 下来,然后发给我分析。 二:WinDbg 分析 1. CPU 真的被打满

聊聊什么是分布式事务

### 概述 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,以上是百度百科的解释。 简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失

聊聊Seata分布式解决方案AT模式的实现原理

### 什么是Seata分布式事务解决方案 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。 ### AT模式 AT模式目前来看是Seata框架独有的一种模式,其它的分布式框架上

聊聊数据库事务内嵌TCP连接

最近再看项目代码,发现很多的service里面,喜欢在事务内部再去调用HTTP请求,简单分析下此种方式的利弊与解决策略。 概述 在数据库内部嵌套TCP连接(一般是HTTP调用或是RPC远程调用)。 @Transactional(rollbackFor = Exception.class) publi

【ASP.NET Core】按用户角色授权

上次老周和大伙伴们分享了有关按用户Level授权的技巧,本文咱们聊聊以用户角色来授权的事。 按用户角色授权其实更好弄,毕竟这个功能是内部集成的,多数场景下我们不需要扩展,不用自己写处理代码。从功能语义上说,授权分为按角色授权和按策略授权,而从代码本质上说,角色权授其实是包含在策略授权内的。怎么说呢?

DevOps|从腾讯TEG CDC解散聊技术中台价值和建设

近日一则腾讯TEG CDC整个部门解散的消息在很多群里炸了锅,有的唱衰互联网行业,有的唉声叹气,还有的甩锅到 AGI 的发展。总体上来说,这个事情的确已经发生了,我想从组织架构和整体效能这两方面来分析下这次组织变化。 腾讯TEG CDC解散 6月28日,网传腾讯TEG CDC整体解散,人员涉及设计师

聊聊我认为的分布式、集群实现关键点

基于常见的中间件(Mysql、ElasticSearch、Zookeeper、Kafka、Redis)等分布式集群设计的机制,自己总结了在在集群设计过程中需要考虑的通用问题。 ### 节点通信机制 主节点的增加、删除、通信机制。 ### 路由算法 即数据路由到哪个节点的策略机制。在集群内有多个节点,