DDD(八)--聚合一致性

一、引言

偶然看到分布式事务一致性的解决方案,想起DDD中聚合也有一致性的概念。数据库


二、一致性

一致性可分为三种:服务器

  • 强一致性
  • 弱一致性
  • 最终一致性

强一致性,也能够称之为实时一致性。当更新操做完成以后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现须要牺牲可用性。分布式

弱一致性,系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功以后,不承诺当即能够读到最新写入的值,也不会具体的承诺多久以后能够读到。.net

最终一致性,弱一致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回上一次更新操做的值。在没有故障发生的前提下,不一致窗口的时间主要受通讯延迟,系统负载和复制副本的个数影响。DNS 是一个典型的最终一致性系统。线程

在工程实践上,为了保障系统的可用性,互联网系统大多将强一致性需求转换成最终一致性的需求,并经过系统执行幂等性的保证,保证数据的最终一致性。对象

举个例子:假设咱们10我的,每人有一个帐号,里面有钱,能够转来转去,这组成了一个小型的数据系统,那么什么叫数据一致性?这是由你本身来定义的,比较通用的就是:这10我的的帐号金额总数不变——知足这一条件,就叫数据一致,不知足,就叫数据不一致,或者在分布式的环境下,有一个数据在几个地方都保存了,那么任什么时候候,这几个地方的数据都必须相同,这也叫一致性。 如今咱们就这个简单的一致性规则:10我的的帐号金额总数不变。假设初始的时候每一个人帐号里有一万,A帐号往B帐号里转5000,这时候数据库要执行两行代码:blog

A:减去5000进程

B:加上5000事务

在执行完第一行代码的时候,这时候数据是不知足一致性条件的!必需要执行完第二行代码,数据才恢复到一致性的状态!换而言之,数据库中的数据是常常处于不一致的状态,这是不可避免的,所以咱们提出了事务的概念,用于检测数据库中的数据是否处于一致性状态——若是数据库中有没有执行完的事务,那就是不一致的,不然,就是一致的。 上面的例子只是最简单的状况,实际的运用中要复杂得多,好比前面提到的分布式系统:某个数据存在了三个服务器上,如今要更新,就必须保证三个服务器上全都更新好,若是有一个没有成功,那么其余两个也应该维持不变。开发

来源:http://www.javashuo.com/article/p-ovpgydmu-ev.html


三、聚合一致性

从聚合的维度考虑,一致性分为“内部一致性”和“外部一致性”。内部一致性是指一个聚合实例自己状态的一致性。外部一致性是指多个聚合实例之间状态的一致性。

聚合是领域对象的显示分组,旨在支持领域模型的行为和不变性,同时充当一致性和事务性边界。

这句话涉及到几个概念,咱们来拆解一下:

  1. 聚合是领域对象的显示分组
  2. 领域行为和不变性
  3. 一致性和事务性边界

领域不变性指的是必须遵照的陈述或规则。换句话说,就是领域内咱们关注的业务规则。

好比建立一个订单,必然会生成订单详情,订单详情确定会有商品信息,咱们在修改商品信息的时候,确定就不能影响到这个订单详情中的商品信息。再好比:用户在下单的时候,会选择一个地址做为邮寄地址,若是该用户马上下另外一个订单,并对本身我的中心的地址进行修改,确定就不能影响刚刚下单的邮寄地址信息。

这个时候,聚合就有很强的做用,经过值对象保证了对象之间的一致性。咱们平时在开发的时候,虽然没有用到DDD,确定也是常常用到聚合,就好比上边的问题,撇开DDD不谈,就平时来讲,你确定不会把商品 id 直接绑定到订单详情表中,为外键的,否则会死得很惨。这个时候其实咱们就有一些聚合的概念了,由于什么呢,下单的时候,咱们关注订单领域模型,修改商品的时候,咱们关注商品领域模型,这些就是咱们说到的聚合。

咱们再结合上面拆解的三点就能够理解了,聚合就是领域对象的动做和行为的一个显示的表现,在领域内聚合中的实体保持的强一致性的特色,可是对外有的时候是保持的弱一致性(当商品聚合中的商品改变时,订单聚合中的商品信息不变)有些时候是最终一致性(当用户聚合中的金额减小时,因交易还未完成,因此商家是不会收到货款,可是最后用户签收时,商家才收到货款),这就是事务性边界。

相关文章
相关标签/搜索