Please enable JavaScript.
Coggle requires JavaScript to display documents.
凤凰架构 - Coggle Diagram
凤凰架构
事务
分布式事务
-
可靠消息队列
每个服务之间通过消息队列流转消息
- 定时任务从A中取状态为进行中的数据投到MQ
- B从MQ中获取消费消息,失败重试直到成功
- B成功后 写消息入MQ,A收到消息修改状态
最大努力交付 一旦A执行成功就必须保证大家都成功
最大努力交付不适合流转环节中可以允许失败的情况。整个过程完全没有任何隔离性。
分为三个阶段
- Try 尝试执行,完成各个业务的可执行检查,并预留资源
- Commit 确认执行,不执行检查直接使用Try阶段预留资源提交,可能会重复执行需要保证幂等性
- Cancel 取消执行,释放try预留的资源
-
- TCC 的最主要限制是它的业务侵入性很强
- 回退操作设计金额比如银行,作权限和数据结构就不可能再随心所欲的地自行定义,通常也就无法完成冻结款项、解冻、扣减这样的操作,
SAGAS
- 将整个分布式事务 T 分解为 n 个子事务。子事务是原子行为。分布式事务提交与连续提交子事务等价
为每一个子事务设计对应的补偿动作,命名为 C1,C2,…,Ci,…,Cn。Ti与 Ci必须满足以下条件:
- Ti与 Ci都具备幂等性。
- Ti与 Ci满足交换律(Commutative),即先执行 Ti还是先执行 Ci,其效果都是一样的。
- Ci必须能成功提交,
如果 T1到 Tn均成功提交,那事务顺利完成,否则,要采取以下两种恢复策略之一:
- 正向恢复 即最大努力交付
- 反向恢复,通过Ci向前补偿每一个子事务
-
全局事务
JTA
全局事务处理框架,有两个接口
- TransactionManager 事务管理接口
- XAResource 资源定义接口
两阶段提交
- pre 参与者预写事务等待协调者发送commit
- commit 协调者发送commit 参与者提交日志
- 如果失败了协调者发送abort 参与者回滚
- 单点问题 如果协调者挂了,参与者会存在一直等待情况
- 一致性问题如果协调者发送了一半commit挂了,会导致数据不一致
- 性能问题,必须等待最慢的参与者提交成功
三阶段提交
- can commit 询问是否准备好
- preCommit 如果准备好则预写事务
- doCommit 都写好了提交事务
- 将准备阶段一分为二的理由是这个阶段是重负载的操作,事先询问是否准备好可以有效提高事务成功效率
- 如果参与者没等到doCommit 默认会自动超时提交,避免一直等待的情况
- 但是无法避免性能问题和一致性问题
架构师视角
-
REST
-
系统
-
-
-
- 中间服务器可以通过负载均衡和共享缓存的机制提高系统的可扩展性例如CDN
- 统一接口: 接口重点是对资源操作,服务抽象成资源,比如:login/loginout 可使用put/delete 操作同一个SESSION资源
-
-