CQRS /事件来源:是否应该共享事件(类型)?

时间:2018-06-19 22:21:12

标签: cqrs event-sourcing

应该共享事件吗?我正在尝试CQRS和事件源,并且想知道事件(类型)是否应该在服务之间共享/定义。

案例:

一个请求进入,新的npm install -s cors命令被推入'commands'事件日志中。服务A(业务逻辑)获取此命令并生成新用户的数据。创建新用户后,它将新数据以事件名称 const express = require('express'); const app = express(); const cors = require('cors'); app.use(cors()); 推送到“事件”事件日志中。服务B(投影仪)注意到新事件并开始处理它。

这是我的问题。我们是否应该为每种事件类型(在这种情况下为createUser)定义为更新实例化视图而需要运行的逻辑?在下面的示例中,我们有两种类型的事件,并且针对每个事件,定义需要发生的动作。在这种情况下,将在逻辑服务和投影仪服务中定义事件类型。

newUser

还是在需要执行的操作类型中定义一个好主意?在这种情况下,事件类型是不共享的,并且投影仪服务无需更改就可以处理未知/新事件。

newUser

选项2是否可行?还是选择这种策略时会遇到问题?

2 个答案:

答案 0 :(得分:1)

事件反映了已经发生的事情。它们通常以过去时命名-userCreated

一般事件(或每个实体一种事件类型)具有许多缺点:

  • 为事件类型查找正确的过去时名称变得更加困难

  • 由于失去了整个域的含义,仅查看事件类型就不再立即可见,因此您失去了一些表现力

  • 无法以细粒度,简化的方式订阅事件,因为您需要“打开信封”以查找正在处理的特定事件

  • 您与域专家讨论的事件之间的差异(例如在Event Storming会话期间)以及它们在类型,消息等中的编码方式。

除了可能在事先不知道实体的非常自由形式/动态的系统中,我不会推荐它。

答案 1 :(得分:1)

我建议使用事件类型来确定将使用事件的业务逻辑/规则类型。

如@ guillaume31所述,使用过去时来命名事件。但是,如果您要为将来做计划,则还应该对事件类型进行版本控制。例如,您可以将事件类型命名为“ userCreated_v1”或“ userFirstNameChanged_v1”。这样,您就可以在将来更改事件消息的结构,并轻松地将新的业务逻辑/规则与新的事件相关联。