从 Eventuate 中的多个事件日志中读取

Read from multiple event logs in Eventuate

我正在玩一些事件源的东西,以感受一下。接下来我想尝试的是Eventuate。它看起来非常好,但是根据我从文档中收集到的信息,任何 EventsourcedActor(以及视图、处理器变体等)只能读取和写入单个事件日志。

例如,我有一个 User 事件日志,每个系统用户都有 EventsourcedActors。这些将获得 CreateUserChangePasswordDeleteUser 等命令,并发出 UserCreated 等事件

现在假设这是一个论坛应用程序,一旦用户删除了他们的帐户,该用户现有的 posts 应该被删除或以其他方式标记。

我该怎么做?我会本能地为论坛 threads/posts 准备一个单独的事件日志,但在那种情况下,我不明白处理这些事件的参与者如何能够监听 UserDeleted.[=20= 这样的事件]

我真的需要一个巨大的事件日志来记录整个应用程序吗?或者我可以让演员从多个事件日志中读取吗?

我见过 EventsourcedProcessor 可以读取一个事件日志并写入另一个事件日志。将其用作 "bridge" 只是为了将事件从一个日志获取到另一个日志似乎有点奇怪。

我直觉上想要的是让任何给定论坛 post 的 aggregate/actor 监听 UserDeleted 事件,然后相应地修改其状态。

但是考虑到这一切,我不确定我是否完全走错了路。

It looks very good, but from what I could gather from the documentation, any EventsourcedActor (and the View, Processor variants, etc) can only read from and write to a single event log.

听起来每个 EventsourcedActor 都应该是一个聚合。挺有道理的。

Now suppose this is a forum application, and once a user deletes their account, existing posts from that user should be deleted or marked in some other way.

How would I do that? I would instinctively have a separate event log for forum threads/posts, but in that case I don't see how the actors dealing with those would be able to listen for an event like UserDeleted.

Do I really need one gigantic event log for the whole application? Or can I make an actor read from more than one event log?

通常的成语是“进程管理器”。基本思想是您有一个非常简单的事件处理程序,用于侦听 EventsourcedActor 编写的更改。当 UserDeleted 事件出现时,流程管理器通过向维护 post 历史记录的 EventsourcedActors 发送 ArchivePost 命令来响应。

基本上,流程管理器是美化的状态机; “当我看到事件 A、B 和 C 时,我应该安排命令 D”。在我看到的示例中,调度是异步的——也就是说,它与事件处理程序在不同的线程上运行。

改款责任自负;也就是说,维护记录簿完整性的责任属于 EventsourcedActor。协调这些变化——确保将正确的命令发送给正确的参与者,这就是状态机所做的。

None 以上内容特定于 Eventuate。 对于事件源解决方案来说,达到需要开始考虑协调的地步是很常见的,并且这是他们通常结束的地方。

由于您通常希望进程记住它们在重新启动时的位置,因此进程本身很可能是事件源的。一路乌龟。

给定一个 Users 事件日志和一个 ForumPosts 事件日志,实际上使用 EventsourcedProcessor 消耗 UserDeleted 事件是非常合理的 Users 事件日志并将它们(可选地转换)写入 ForumPosts 事件日志。

只要代表用户论坛 post 的 EventsourcedActor 被激活,它们就会消耗 UserDeleted 事件并将其内部状态更改为 deleted,例如。与 , it has the advantage that forum post actors don’t need to be alive for processing commands from the process manager which is especially useful when you have thousands or millions of these actors. With event-driven communication 中描述的 进程管理器 方法相比,您在时间上有额外的解耦。

如果您仍想遵循 进程管理器 方法,您可以使用 confirmed delivery 可靠地将进程管理器命令传递给接收者,并结合命令中的幂等命令处理论坛 post 参与者的处理程序。另一方面,对于事件驱动的通信,如前一段所述,您无需关心事件处理程序中的幂等性,因为 EventsourcedProcessors 是幂等生产者,即您永远不会看到 UserDeletedForumPosts 事件日志中重复。