首页 > 其他分享 >分布式事务一致性与本地消息表

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

时间:2023-05-19 12:11:48浏览次数:49  
标签:CAP 消息 本地 一致性 节点 分布式

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

什么是分布式事务一致性

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

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

消息的丢失与幂等

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

消息幂等

image

消息丢失

image

总结

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

标签:CAP,消息,本地,一致性,节点,分布式
From: https://www.cnblogs.com/zhiyong-ITNote/p/17414770.html

相关文章

  • 分布式系统关键技术:服务调度
    1、服务关键程度服务关键程度,主要是梳理和定义服务的重要程度。这不是使用技术可以完成的,而是需要细致地管理对业务的理解,才能定义出架构中各个服务的重要程度。 2、服务依赖关系梳理出服务间的依赖关系,这点也非常重要。我们常说,“没有依赖,就没有伤害”。这句话的意思就是说......
  • java-raft框架之atomix进行分布式管理
    共识算法在一个分布式的系统中,管理各个节点的一致性(共识)一直是个很有难度的问题。在近几十年的发展中,于1990年诞生的Paxos算法是其中最为经典的代表,并一统江湖数几十载。如著名的zookeeper、chubby都是基于Paxos算法的经典应用。不过Paxos算法的复杂度和难以理解性,也吸引了一些大佬......
  • 分布式事务理解
    分布式系统:是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。分布式事务:是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。根据分布式系统CAP定理和base理论可知,分布式系统只......
  • 使用PHPCS+GIT钩子保障团队开发中代码风格一致性实践
    一、背景笔者在6月份加入新团队,新团队这边刚组建起来,基础一些东西还处于待完善状态,比如笔者组内同学约定使用PSR-2的编码风格规范,但是并不是所有人都严格按照PSR-2来提交代码。最大的原因就是口头的约束力极为有限,而团队中大家使用的编辑器不统一,有使用phpstorm,也有使用VSCode更有......
  • Navicat连接本地mysql报错-caching_sha2_password
     查询用户加密方式:selectuser,pluginfromuserwhereuser='root';修改用户加密方式改为mysql_native_password。alteruser'root'@'localhost'identifiedwithmysql_native_passwordby'123123';执行命令flushprivileges使权限配置项立即生效flushp......
  • 本地事务失效问题描述及其解决方案
    什么情况下会出现本地事务失效的问题,为什么会出现本地事务失效问题? 在分布式架构中,本地事务失效的原因主要是在于分布式事务的实现难度和复杂度,需要在多个服务之间进行协调、通信和同步状态等,在特定的情况下,可能会出现延迟,中断或者失败的问题。 举一个简单的例子:如果在多个......
  • JVM(五)本地方法接口
    JVM(五)本地方法接口和本地方法栈1本地方法一个NativeMethod就是一个Java调用非Java代码的接口。在定义本地方法的时候,不提供实现体标识符native能够和除了abstract的java标识符连用publicclassNativeTest{ publicnativevoidmethod1()throwException; .........
  • 银行核心系统如何选型分布式数据库(含6大落地要点验证)
    银行核心系统如何选型分布式数据库(含6大落地要点验证)dbaplus社群 2022-06-24 投诉阅读数:854来自专栏:数据库全能进阶共38篇a​​本文根据洪烨老师在〖deeplus直播:金融业数据库转型与国产化改造〗线上分享演讲内容整理而成。(文末有回放及PPT获取方式,不要错过)  随......
  • 分布式电源选址定容,储能选址定容。 matlab程序 粒子群(
    分布式电源选址定容,储能选址定容。matlab程序粒子群(考虑时序与不考虑)、改进灰狼(考虑时序):以总网损最低或电压偏差最低为目标函数。多目标粒子群:网损和电压。IEEE69节点系统为例(matpower进行潮流计算,可换其他节点,可改分布式电源数据例子为3个分布式电源),对比接入前后电压、网损变化......
  • 分布式系统的技术栈
    构建分布式系统的目的是增加系统容量,提高系统的可用性。说白了就是干两件事。一是提高整体架构的吞吐量,服务更多的并发和流量,二是为了提高系统的稳定性,让系统的可用性更高。1、如何提高整体架构的吞吐量,服务更多的并发和流量?1)提高系统性能的常用技术缓存系统:在分布式系统......