我目前正在阅读微服务模式,它说分布式事务主要有两种方法:两阶段提交(2PC)和sagas模式。
此外,我听说了目前正在发展的分布式SQL(DSQL)工具,如CockroachDB、YuGabyteDB和YDB,它们还通过自己的低级db节点通信支持分布式ACID类事务。
那么问题是,后者是否可以作为前者的替代方案?
为了说明这个问题,考虑以下典型的微服务分布式事务示例。这里我们需要2PC或sagas来进行红色区域协调。
我想要的是完全消除从业务逻辑方面开发和支持协调的需要,将其移动到通用 DSQL 引擎:
一方面,很明显,这种方法以某种方式打破了微服务的责任分离原则。此外,据我了解,DSQL 工具主要针对复制/分片任务而发展,而不是用于微服务的业务逻辑协调。另一方面,它将大大简化开发和支持此类解决方案的过程。
在微服务架构中拥有独立的数据库有几个不同的好处。通过使用分布式数据库可以避免一些问题——CockroachDB的弹性、可伸缩性和动态负载平衡意味着您通常不需要担心将数据库调整为单个服务的工作负载。但其他人则不然。拥有独立的数据库迫使您的服务通过定义良好的API进行交互,这可以防止它们的逻辑紧密耦合,从而允许它们独立开发和更新。如果您使用共享数据库来实现一致性,那么无论采用何种机制,您都必须引入逻辑耦合,因为您需要对需要一致性的内容有一个共同的理解。这可能是不可避免的,在这种情况下,关键是使一致性逻辑变得明确易读,这在Raft级别实现时可能比在API中实现时更棘手。
我认为这取决于你想分离什么。对于分布式SQL数据库,一个数据库上的许多操作不会影响同一集群中的其他数据库。比如滚动升级(相对于单一数据库,您必须关闭共享同一个数据库的所有应用程序)、纵向扩展、横向扩展。
您还可以在同一个集群中,将节点专用于特定的应用程序。或者将它们移动到不同的区域。借助PostgreSQL兼容性,您可以使用相同的数据库为许多用例(关系、JSON、键值、时间序列…)提供服务。对于这些,您可以从共享相同的基础架构、管理服务提供商、技能中受益…并且仍然解除应用程序的耦合。
由于需要解耦更多,比如异步复制,YugabyteDB 具有 xCluster 复制。而且,在SQL层中,应用程序和数据之间可以进行许多级别的协调。PostgreSQL兼容性附带触发器,可以调用外部操作,或者外部数据包装器,可以使用标准API与其他数据库进行交互。
因此,我认为分布式数据库在解耦一切(如数据库供应商的选择)和影响应用程序的完全整合之间带来了更多可能性。
我正在发展我对分布式系统的见解,以及如何在这样的系统中保持数据一致性,其中业务事务涵盖多种服务、有限的上下文和网络边界。 我知道有两种方法用于实现分布式事务: 2阶段提交(2PC) 萨加斯 2PC 是一种协议,供应用程序通过平台支持透明地利用全局 ACID 事务。据我所知,它嵌入在平台中,对业务逻辑和应用程序代码是透明的。 另一方面,Sagas是一系列本地事务,其中每个本地事务都会发生变化,并保存
ShardingSphereTransactionManager SPI 名称 详细说明 ShardingSphereTransactionManager 分布式事务管理器 已知实现类 详细说明 XAShardingSphereTransactionManager 基于 XA 的分布式事务管理器 SeataATShardingSphereTransactionManager 基于 Seata 的分
ShardingSphere-Proxy 接入的分布式事务 API 同 ShardingSphere-JDBC 保持一致,支持 LOCAL,XA,BASE 类型的事务。 XA 事务 ShardingSphere-Proxy 原生支持 XA 事务,默认的事务管理器为 Atomikos。 可以通过在 ShardingSphere-Proxy 的 conf 目录中添加 jta.properties 来定
通过 Apache ShardingSphere 使用分布式事务,与本地事务并无区别。 除了透明化分布式事务的使用之外,Apache ShardingSphere 还能够在每次数据库访问时切换分布式事务类型。 支持的事务类型包括 本地事务、XA事务 和 柔性事务。可在创建数据库连接之前设置,缺省为 Apache ShardingSphere 启动时的默认事务类型。
背景 数据库事务需要满足 ACID(原子性、一致性、隔离性、持久性)四个特性。 原子性(Atomicity)指事务作为整体来执行,要么全部执行,要么全不执行。 一致性(Consistency)指事务应确保数据从一个一致的状态转变为另一个一致的状态。 隔离性(Isolation)指多个事务并发执行时,一个事务的执行不应影响其他事务的执行。 持久性(Durability)指已提交的事务修改数据会被持久
单文档原子性可满足大多数业务需求 在 MongoDB 中,对单个文档的操作是原子操作。 由于 MongoDB 文档数据模型,一个文档中通过嵌入式的文档和数组来表示传统关系数据库模型中的一对一、一对多关系,而不是通过文档之间的复杂关系来描述业务需求中的一对一、一对多关系。 所以单文档原子性可以满足实际生产中大多数关于事务的需求。 对于需要对多个文档(在单个或多个集合中)进行原子读写的情况,Mongo