事务模式
聚合根的本地事务解析
在介绍分布式事务具体之前,先剖析一下 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领域设计出不同类型的聚合根,比如商品购物业务场景可以划分为商品仓储和资金账户两类聚合根,不同类别聚合根会协作完成购物的流程,这样则会涉及分布式事务的场景。
