事务模式
聚合根的本地事务解析
在介绍分布式事务具体之前,先剖析一下 phoenix 中实体聚合根的本地事务。
在Phoenix当中,实体聚合根是最小的逻辑处理单元,一个Phoenix集群会有N多个实体聚合根对象,每个实体聚合根对象在处理消息时都满足事务中ACID
的特性,下面解析一下实体聚合根对ACID
的支持能力。
特性 | 支持级别 | 实现原理 |
---|---|---|
原子性(Atomicity) | 支持 | 实体聚合根处理消息修改多个状态时,可以保证要么全部成功要么全部失败。 |
一致性(Consistency) | 支持 | 实体聚合根处理消息是有序处理的,对于每个消息处理时,状态是线性一致的。 |
隔离性(Isolation) | 支持 | 实体聚合根处理消息是有序处理的,隔离级别是最高(串行化)。 |
持久性(Durability) | 支持 | 实体聚合根的状态依赖EventStore存储,依赖EventSouring技术恢复。 |
分布式事务产生的背景
在Phoenix当中,业务是实体聚合根
处理的,实体聚合根都有一个唯一id标识(聚合根id),一个实体聚合根内部处理消息
时满足事务的ACID
特性。但业务系统使用Phoenix开发服务时,会对业务做水平
和服务化
拆分成不同的聚合根,如果一个业务请求需要多个聚合根一起完成的话,就引出了分布式事务。
实体聚合根水平拆分
在使用Phoenix框架时,为了追求并发粒度来承担更大的业务体量,会对一个聚合根做水平
拆分,通常一个聚合根类通过不同的聚合根id
来生成不同的聚合根对象
,那么不同的聚合根对象运行时会在不同的节点当中。如下图所示,一个账户聚合根通过账户id来生成了N个聚合根对象,这些聚合根对象运行在不同的节点当中,如果发起账户1
对账户2
的转账请求,则会涉及到分布式事务场景。
实际上
账户1
向账户3
转账也是一个分布式事务,虽然这两个实体聚合根对象在一个节点上,但是phoenix是无服务化的思想,一切都以聚合根隔离。
实体聚合根服务化拆分
在使用Phoenix框架时,会进行DDD领域设计出不同类型的聚合根
,比如商品购物业务场景可以划分为商品仓储
和资金账户
两类聚合根,不同类别聚合根会协作完成购物的流程,这样则会涉及分布式事务的场景。