微服务架构设计模式 | 第6章 使用事件溯源开发业务逻辑

2021-08-31  本文已影响0人  多氯环己烷

前言

事件溯源是一种以事件为中心的编写业务逻辑和持久化领域对象的方法。事件溯源可以消除一些可能的编程错误,因为这项技术可以保证在创建或更新聚合时一定会发布事件。

这是一本关于微服务架构设计方面的书,这是本人阅读的学习笔记。下面对一些符号做些说明:

()为补充,一般是书本里的内容;
[]符号为笔者笔注;


1. 使用事件溯源开发业务逻辑概述

事件溯源模式:使用一系列便是状态更改的领域事件来持久化聚合。

1.1 传统持久化技术的问题

1.2 事件溯源通过事件来持久化聚合

事件溯源采用基于领域事件的概念来实现聚合的持久化;它将每个聚合持久化为数据库中的一系列事件,称为事件存储。

事件溯源将每个聚合作为一系列事件来持久化保存
图解

1.3 事件溯源对领域事件提出的新需求

1.4 事件代表状态的改变

事件中必须包含聚合执行状态变化所需的数据

1.5 聚合方法都和事件相关;

调用聚合命令方法的结果是一系列事件 事件溯源框架例子

图解

1.6 创建与更新聚合的步骤

创建聚合的步骤

  1. 使用聚合的默认构造函数实例化聚合根;
  2. 调用process()以生成新事件;
  3. 遍历新生成的事件并调用apply()来更新聚合的状态;
  4. 将新事件保存在事件存储库中;

更新聚合的步骤

  1. 从事件存储库加载聚合事件;
  2. 使用其默认构造函数实例化聚合根;
  3. 遍历加载的事件,并在聚合根上调用apply()方法;
  4. 调用其process()方法以生成新事件;
  5. 遍历新生成的事件并调用appply()来更新聚合的状态;
  6. 将新事件保存在事件储存库中;

1.7 基于事件溯源的Order聚合

基于事件溯源的Order聚合 事件溯源使用process和apply替代原方法

1.8 使用乐观锁处理并发更新

指两个或多个请求同时更新同一聚合的情况;

1.9 事件溯源和发布事件

1.10 使用快照提升性能

长生命周期的聚合可能会有大量事件;随时间推移,加载和重放这些事件会变得越来越低效;常见解决方法是定期持久保存聚合状态的快照;

使用快照避免加载聚合所有事件

1.11 幂等方式的消息处理

使用相同的消息多次安全地调用消息接收方,则消息接收方是幂等的;具体实现方式取决于事件储存库是关系型数据库还是NoSQL数据库;

1.12 领域事件的演化

事件溯源应用程序的结构分三个层次

每个级别可能发生的不同类型的更改

每个级别可能发生的不同类型的更改

通过向上转换(Upcasting)来管理结构的变化

1.13 事件溯源的好处与弊端

好处

弊端

2. 实现事件存储库

使用事件溯源的应用程序将事件存储在事件存储库中;事件存储库是数据库和消息代理功能的组合;它表现为数据库和消息代理;

2.1 Eventuate Local事件存储库的工作原理

Eventuate Local的事件数据库结构

通过订阅Eventuate Local的事件代理接受事件

Eventuate Local的事件中继把事件从数据库传播到消息代理

2.2 针对Java语言的Eventuate Client框架提供的主要类和接口

Eventuate Client框架使开发人员能够使用Eventuate Local事件存储库编写基于事件溯源的应用程序;它为开发基于事件溯源的聚合、服务和事件处理程序提供了框架基础;

针对Java语言的Eventuate Client框架提供的主要类和接口

图解

3. 同时使用Saga和事件溯源

事件溯源可以轻松使用基于协同式的Saga;将事件溯源的业务逻辑与基于编排的Saga相结合更具挑战性;

3.1 使用事件溯源实现协同式Saga

3.2 创建编排式Saga

Saga编排器由服务的方法创建,会执行创建和更新聚合两项操作,该服务必须保证则两个操作在同一个事物中完成;因此取决于使用的事件数据库类型;

当关系型数据库作为事件存储库时,应该如何创建Saga编排器

当非关系型数据库作为事件存储库时,应该如何创建Saga编排器

3.3 使用事件处理程序创建Saga编排器的案例

使用事件处理程序创建Saga编排器
好处:保证松耦合,因为OrderService之类的服务不再明确地实例化Saga;

问题:如何处理重复事件保证幂等性,解决方法如下:

3.4 实现基于事件溯源的Saga参与方

3.5 基于事件溯源的Saga参与方的例子

下图显示了Accounting Service如何处理Saga发送的Authorize Command;Accounting Service使用Eventuate Saga框架,该框架用于编写使用事件溯源的Saga;

基于事件溯源的Saga参与方的例子

3.6 实现基于事件溯源的Saga编排器

可靠地发送命令式消息

4. 本章小结


最后

\color{blue}{\rm\small{新人制作,如有错误,欢迎指出,感激不尽!}}

\color{blue}{\rm\small{欢迎关注我,并与我交流!}}

\color{blue}{\rm\small{如需转载,请标注出处!}}

上一篇 下一篇

猜你喜欢

热点阅读