0

这是我的第一个问题,如果不清楚或不完整,请原谅,让我知道如何提供更多信息。

我正在尝试使用 CQRS + ES 构建电子邮件票务系统。因此,电子邮件被加入到对话中(有点像 Outlook 对话,但加入的标准不同),然后这些对话被分配一张票,人们可以与之互动(标记它,更新它的状态,添加注释......)。

目前,一旦收到邮件,就会创建一个引发MailReceived事件的新邮件聚合。
ProcessManager路由器(或传奇路由器)尝试根据条件找到匹配的“ConversationSaga”或创建一个新的。saga 发送一个命令,将对话 Id 分配给 Mail 聚合 --> 引发ConversationAssigned邮件。

最后一个事件ConversationAssigned被 Ticketing 有界上下文拦截,该上下文会根据对话 Id 生成票证或更新现有票证。创建/更新票证后,该事件将被路由到 ConversationSaga 以发送所需的命令(ApplyTicketToMail --> MoveMailToFolder --> ...)

我的问题是:
1-使用 Saga Id 作为将多个邮件链接在一起的对话 Id 是否异常?
2-我正在检查创建Conversation Aggregate根的可能性,但我对事件溯源仍然很陌生,并且不知道如何处理 AggregateRoots 中的事件溯源实体(我需要 Mail 作为事件溯源聚合)。

PS:我使用的是 C#,带有 MsSql DB 和 nhibernate,并且消息传递是通过 RabbitMq 进行的。

4

1 回答 1

0

我有一些问题要阅读/理解您的描述,但整体设计对我来说似乎很好。特别是,从一个 saga 中编排多个 AR 是一种常见的做法。

根据您写的内容,我确实建议创建一个与 ARConversation分离的新聚合,Mail特别是因为您已经将它命名为这样(“对话”),因此它似乎是无处不在的语言中的一个术语。

于 2015-06-08T09:48:42.727 回答