范畴驱动计划 2

打印 上一主题 下一主题

主题 907|帖子 907|积分 2721

1.幂等计划

1.1.界说

无论进行多少次类似的操作,结果都保持同等的计划。
1.2.写操作的幂等性

1.2.1.Insert

指定唯一标识写,是具有幂等性的。
不指定唯一标识写,不具备幂等性。
1.2.2.Update

如果更新操作依赖于与汗青状态,则不是幂等的,反之则幂等。
例:
  1. //无论执行多少次 count的值都为1
  2. Update test_table set count = 1 where id = 1;
  3. //count的最终值,取决于执行次数,所以是非幂等的
  4. Update test_table set count = count+1 where id = 1;
复制代码
1.2.3.Delete

删除操作自然幂等,因为删除之后数据就没了,再删一次,数据仍旧没了。
1.3.幂等性计划

1.3.1.唯一索引

通过给每一个操作一个requestId,并将其记录到操作记录表中,保证操作只会实验一次。如:某个操作的requestId为1,当其实验完了,则将其插入操作记录表中。当再次实验该操作时,其requestId在操作记录表中已经存在,则不应再实验该操作。流程如下:

1.3.2.有限状态机

有限状态机(简称状态机),表示有限个状态以及在这些状态之间的转移和动作等举动的模子。

2.范畴事件

范畴事件是聚合内已经发生的究竟,代表聚合内已经发生了业务操作或状态变化。范畴事件通常由聚合根产生,且因该是值对象或贫血对象。
范畴事件可解耦范畴对象之间的耦合度,通过发布事件通知其他对象自身发生了某个事件,取代直接调用。可实现夸聚合的数据同等性。
3.范畴事件发布

例子:
  1. public class ApplicationSevice{
  2.   @AutoWired
  3.   DoMainService dms;
  4.   @AutoWired
  5.   DoMainEventPublisher publisher;
  6.   public void handleSomeThing(SomeCommand command){
  7.     //领域服务完成某项业务,并返回领域事件
  8.     List<DomainEvent> eventList = dms.doSomeThing(command);
  9.     //推送领域事件
  10.     publisher.publish(eventList);
  11.   }
  12. }
复制代码
在上述例子中,范畴服务实验完事务后,如果推送范畴时间这一步实验失败,会导致完整的业务流程没有实验成功。
为了解决这个标题,可以将范畴事件长期化并可靠地发布事件。
3.1.范畴事件长期化

例:
  1. public class DomainRepository{
  2.   @Resource
  3.   EventRepository eventRepository;
  4.   @Resource
  5.   DataRepository dataRepository;
  6.   @Transactional
  7.   public void save(Entity entity){
  8.     //获取领域事件
  9.     List<DomainEvent> events = entity.getEvents();
  10.     //将领域事件转换为持久化存储事件
  11.     List<Event> eventList = events.stream().map(s->{......}).collect(Collectors.toList());
  12.     //持久化领域事件
  13.     eventRepository.saveAll(eventList);
  14.     //将实体转换为是数据库对应的数据模型
  15.     DataModel d = toDataModel(entity);
  16.     //持久化数据模型
  17.     dataRepository.save(DataModel);
  18. }
  19. }
复制代码
3.2.可靠发布范畴事件

3.2.1.直接发布并赔偿机制


1)范畴服务在实现详细的业务时,应长期化保存范畴事件,并将范畴事件的状态设置为未完成发布。
2)当应用层调用范畴服务完成业务逻辑处理惩罚之后,将范畴服务返回的事件直接发布。
3)事件发布成功后,将数据库中事件状态更新为发布成功。
4)定时使命定时扫描近来一段时间范围内的状态为未发布成功的范畴事件,并将这些事件进行发布,发布成功之后,修改其状态为发布成功。
3.2.2.事物日志拖尾

频仍地轮训数据库可能会对数据库造成压力。此时可以思量接纳事务日志拖尾的方案。事务日志拖尾,指监听数据库的事务日志,以获取增量的新数据,可通过CDC中间件来实现。常见的CDC中间件包括Debezium、Canal、Flink CDC等。

1)范畴服务实验完业务逻辑之后,长期化存储范畴事件。
2)CDC中间件通过监听事务日志,读取到增量的新数据。CDC中间件从数据中剖析失事件,发布到消息队列中。
4.范畴事件订阅

范畴事件订阅需要思量幂等性计划。事件的发布和订阅可通过消息中间件kafka实现。
5.CQRS的概念

CQRS(Command Query Responsibility Segregation)命令查询职责分离架构模式。通过不同的模子实现Command(数据修改)与Query(数据查询)分离。
6.为什么要引入CQRS?

聚合根事是务同等性的边界。开辟者在处理惩罚业务时为了保证业务的准确性,需要完整的加载整个聚合根。而Query操作不一定需要完整的聚合根,可能只需要聚合根的一部门状态,且不会对状态进行修改,此时将完整的聚合根加载到内存中,可能因为读取的数据过多影响性能。所以需要将Query操作与Command操作分脱离来。
在范畴驱动计划的架构中,可以直接在应用层调用底子设施层服务进行查询并返回查询条件,而不用调用范畴模子进行查询。
7.CQRS实现方式

7.1.方法级

一个方法要么实验Command,要么实验Query,不应在Command方法中返回View对象。
7.2.类似数据源CQRS


Command操作处于DDD应用中,Query操作处于三层贫血应用中。
7.3.异构数据源CQRS

数据的Command操作和Query操作可能使用不同的数据源。此时Command的应用仍接纳DDD模子,Query操作可接纳三层贫血模子。但两个数据源之间应存在同步机制,保证数据的同等性。可通过事件发布+赔偿机制或者事务日志拖尾的形式实现。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表