《DDD with TLA+》(4) Transaction Commit
事务系统
![](https://static001.geekbang.org/infoq/dd/dd234d57bc6b5a5402d4d09be0b76142.png)
分布式各个节点上都有一些资源,我们希望这些资源是一致的。
我们先不管分布式事务是怎么实现的。我们看下需要满足哪些要求:
事务可以提交也可以取消
仅当所有 RM 都准备提交时,事务才能提交
任何一个 RM 想要取消事务,事务必须取消
所有 RM 必须在事务提交还是取消上一致
状态迁移
![](https://static001.geekbang.org/infoq/e3/e35a7e8d240a4b095f33e5fba37156d6.png)
初始状态:所有 RM 的状态都是 working
接下来:RM 可以进行准备或者做决策
准备:
如果 RM 的某个状态是 working,那么它的下一个状态可以是 prepared
做决策:
1、如果 RM 的某个状态是 prepared,并且此时所有 RM 的状态都是 prepared 或者 committed,那么它的下一个状态可以是 committed
2、如果 RM 的某个状态是 working 或者 prepared,并且此时所有 RM 的状态都不是 committed,那么它的下一个状态可以是 aborted
约束
不存在两个 RM:r1 和 r2,r1 的状态是 committed 但 r2 的状态是 aborted
TLA+ code
![](https://static001.geekbang.org/infoq/f4/f4c8a4554349fdb0284bb2b20abdfb56.png)
2PC & Paxos
![](https://static001.geekbang.org/infoq/28/28a09ddff442015e766c9ac4cf35c143.png)
分布式系统里面,很多问题一定要有一个协调者。那这个协调者是一个单点的,还是一个“动态”的一个。Paxos 就是解决如何“动态”的一个问题。如何避免协调者成为单点问题。
从模式到架构
![](https://static001.geekbang.org/infoq/70/70b80e9c46897842e53432f77c6c9ff8.png)
架构风格
BoundedContexts 实现为自治的服务(组件)
Hexagonal Architecture
![](https://static001.geekbang.org/infoq/6e/6e70e8e0204d5524840a63c9d5c93299.png)
Onion Architecture
Clean Architecture
几乎是面向对象的最佳实践
各个层次都是反向依赖,DIP
![](https://static001.geekbang.org/infoq/1f/1f30c07f0486f8a81141d9124ba31c48.png)
但是并没有从整体上去描述行为,更多的是打散在各个对象里了。
这里还是有很多副作用,只是说我用接口调用了,并不是直接调用了。
Functional Core, Imperative Shell
https://www.destroyallsoftware.com/talks/boundaries
This talk is about using simple values (as opposed to complex objects) not just for holding data, but also as the boundaries between components and subsystems. It moves through many topics: functional programming; mutability's relationship to OO; isolated unit testing with and without test doubles; and concurrency, to name some. The "Functional Core, Imperative Shell" screencast mentioned at the end is available as part of season 4 of the DAS catalog.
If you liked this, you might also like Execute Program: interactive courses on TypeScript, Modern JavaScript, SQL, regular expressions, and more. Each course is made up of hundreds of interactive code examples running live in your browser.
![](https://static001.geekbang.org/infoq/71/7136f4c2ade763c43ba116c2ed811e82.png)
把整个处理分为两层。
内层返回指示,完全没有副作用。只是一个计算的描述。
外层解释执行依赖。执行计算的描述。
这种方式的架构风格需要重点关注,这个是非常适合电信系统的。
评论