0

使用服务总线实现。当特定用户阅读电子邮件时,我们会引发电子邮件已被阅读的事件。我们有一个订阅者,当它被引发时,它会接收到这个事件。当电子邮件被读取时,我们想要执行一个操作,然后在数据库中记录电子邮件已被读取。

我的问题是:- 你会 a) 引发另一个事件,然后该事件将由日志服务订阅,该服务将侦听为此系统和其他系统引发的所有日志事件?b) 收听电子邮件的订阅者是否已阅读电子邮件已阅读的事件日志?c) 做其他事情?

4

4 回答 4

0

你是否遵循 DDD 原则,如果是这样,你为什么想要一个服务来记录?

如果该“日志记录”是业务需求的一部分,这意味着存储库中的状态更改,那么它需要成为在用户阅读电子邮件后引发事件的事务的一部分,而不是其他方式回合,但在我看来,从 DDD 的角度来看,拥有一个单独的服务来记录并不是最好的方法,如果你有一个中央服务来处理系统中的所有消息,那么拥有一个单独的服务有什么意义呢?首先是分布式系统?

“你会 a) 引发另一个事件,然后由日志服务订阅该事件,该服务将侦听为该系统和其他系统引发的所有日志事件?

我认为您不应该这样做,因为事件处理程序不应发布另一个事件,而应提交命令。

另一方面,为什么您不能在引发事件的服务中完成该日志?因为那是行动发生的地方。

马可

于 2013-04-16T00:26:12.820 回答
0

这完全取决于您是否希望将日志记录执行作为当前事务的一部分。随着系统容量的增长,您可能会发现优化将向另一个端点发送消息以完成日志记录。我不会在日志中使用 pub/sub,您应该能够使用简单的点对点通信。

于 2013-04-11T12:44:04.473 回答
0

在订阅者上有一个审计队列怎么样?然后,您可以有一个单独的处理程序来从审核队列中提取消息并记录您感兴趣的事件(在这种情况下,电子邮件已被读取事件)。

于 2013-04-12T04:26:43.000 回答
0

如果我理解你,你说,

我们引发了电子邮件已被阅读的事件。我们有一个订阅者,当它被引发时,它会接收到这个事件。当电子邮件被读取时,我们想要执行一个操作,然后在数据库中记录电子邮件已被读取。

因此,您引发“电子邮件阅读”事件,订阅者将其拾取并执行操作。目前,执行该操作后,不会进行任何记录。

您可以让同一个订阅者在执行操作后执行日志记录,或者与操作并行执行日志记录,或者您可以让第二个订阅者监听“Email Read”事件并执行日志记录。

这取决于日志记录是否意味着相对于“操作”是事务性的,日志记录是否必须可靠,以及其他此类考虑。当然,还有可维护性、管理、审计等方面的正常考虑。

换句话说,“这取决于”。

于 2013-04-12T04:32:34.717 回答