基于事件的系统中的消息格式

Message Format In Event Based System

我正在尝试了解有关定义消息的最佳做法,但我有几个高级问题。

  1. 似乎我们所有的消费者都需要消息的不同方面。这是否意味着消息格式最终会成为每个分布式系统所需的一切的结合?
  2. 在不了解所有消费者的情况下,我怎么知道要在消息中添加什么?
  3. 是否有任何最佳实践来帮助确定我是否需要接近我的 table 外观的消息与更高级别的消息?似乎每当我定义一条消息时,它都与我的数据库模式紧密相关。

Greg Young 的书 Versioning in an Event Sourced System 对我理解信息有很大帮助。

It seems like all our consumers need different aspects of a message. Does that mean message formats just end up being a union of everything each distributed system needs?

这通常意味着更细粒度的消息,订阅者对他们查看的消息更有辨别力。

Without knowing all my consumers, how do I know what to put in a message?

尤其是当您不确定要在消息中放入什么时,请集中精力设计可以安全发展的模式。

Are there any best practices to help determine if I need messages that are close to what my table looks like vs. a higher level message? It seems like whenever I define a message, it's really closely tied to my database schema.

这不完全是巧合。如果您眯着眼睛想像一下,您可能会注意到事件是从一个系统到另一个系统的消息,其中持久性是从系统的过去版本到现在的消息。

因此,存在相似之处并不完全令人震惊。

要小心的一个原因是单个服务可以很容易地更改其持久化表示,因为它是唯一的客户端。但是,如果发布者 和所有订阅者 需要更新,则在服务之间更改消息需要格外小心。跨部署边界的消息通常需要比在单个部署单元内使用的消息更稳定的模式。

在事件溯源中,域事件被持久化而不是整个状态。所以领域事件包含重建正确状态所需的所有信息。这意味着您将领域事件设计为清晰、完整和正确地表达已发生的事实。

最安全的事情就是只在事件中放入重建状态所绝对必要的东西,仅此而已。如果您正确设计事件(根据领域),那么所有订阅者都可以投射任何有效的可能状态(从领域的角度来看),最有可能通过订阅多个事件流。事件越简单,需要订阅的流就越多,但这没关系。