7

假设您有多个由事件集成的系统,并且它们都使用事件溯源。你在哪里存储事件?

就我而言,我有三个系统:

  • 一个网站,一个商店
  • 网站的后端,用于管理客户、产品等。
  • 会计系统

每当在这些系统之一中发生域事件时,该事件就会被发布并且可以由其他系统处理。所有系统都使用事件溯源。

我想知道您将在哪里保存事件。当然,每个系统都必须存储它处理的所有事件,因为它使用事件源,因此依赖于它曾经处理过的事件。

但是对于其他不需要且因此系统没有订阅的事件呢?我正在努力解决需求可能会发生变化的事实,这样系统就必须处理过去没有持续存在的事件。如果系统需要处理发生时未订阅的事件,您将从哪里获得这些事件?

我认为此时不使用事件溯源的系统有很大的不同。如果您必须在系统 A 中实现依赖于数据的功能,该功能在 A 中不可用,但在另一个系统 B 中,并且您通过像 NHibernate 这样的 ORM 工具保持当前状态,您可以简单地将数据从 A 导入到 B . 由于使用事件溯源的系统依赖于事件来达到其当前状态,因此您必须导入过去错过但现在需要的所有事件。

对我来说,这个问题有几种不同的方法。

  1. 每个系统都保存所有发布的事件。这使您能够在需要时重新发布事件或将它们导入另一个系统。
  2. 每个系统都会保存所有发生的事件,即使是那些(还)不需要处理的事件。
  3. 来自所有系统的所有事件都存储在中央事件日志中。如果您需要处理过去发生但您没有订阅的事件,您可以从这里导入它。

你如何处理这样的情况?你在哪里保存你的事件?

编辑

感谢 Roy Dictus 的回答。我仍然不确定如何处理以下情况:

该网站发布事件 CustomerRegistered、CustomerPurchasedProduct 和 CustomerMarkedProductAsFavorite。在后端的当前版本中,必须显示客户并且必须显示他们的购买。客户标记为收藏的内容对该版本的系统不感兴趣。因此后端只订阅了 CustomerRegistered 和 CustomerPurchasedProduct。

现在营销部门还希望在客户详细信息页面上显示有关最喜欢的产品的信息。由于后端未订阅 CustomerMarkedProductAsFavorite,因此此信息在后端不​​可用。我从哪里得到这些信息?

4

2 回答 2

7
  1. 每个系统都存储自己的事件。每个系统都是自己的 CQRS 系统,或者至少是自己的独立服务,因此对自己的数据负责。
  2. 每个系统还将其事件发布到服务总线。此服务总线确定保存这些事件的位置。通常它在事务排队系统中。
  3. 每个系统都订阅它使用的外部事件。它不存储这些传入事件,仅存储由它们产生的自己的事件。当它使用传入事件时,服务总线知道它可以从该服务的传入队列中删除该事件。

编辑以适应您的额外问题:

如果另一个应用程序突然对额外信息感兴趣,它必须向它现在感兴趣的事件添加侦听器。

此外,这些事件的所有源都可以重播这些事件。重放是允许此类场景的事件驱动系统的一个强大功能。因此,事件源仅重播选定的事件(例如,过去 6 个月的所有 CustomerMarkedItemAsFavorite 事件)。已经使用这些事件的系统应该认识到重放的事件是“旧的”事件(即,它已经处理过的事件)并忽略它们。

这样,任何被更新以使用来自其他子系统的额外信息的子系统都可以获取该信息并在单个批处理操作中获取所有最新信息。

于 2011-06-04T20:54:37.653 回答
0

WRT 您的编辑:是否真的需要访问历史 CustomerMarkedProductAsFavorite 数据。更改后端以订阅新数据,然后您就可以继续使用它。如果您确实需要,您可以解决如何将丢失的数据作为单独的问题回填。

Roy 已经概述了一种可能的体系结构,该体系结构可确保您将 CustomerMarkedProductAsFavorite 数据回填。

于 2011-06-05T09:14:41.970 回答