事件存储中的事件模型或模式

Event model or schema in event store

事件存储(事件源)中的事件通常以序列化格式持久保存,其中版本表示事件类型的模型或架构中的更改。我无法找到显示实际事件的实际模型或模式的良好文档(如果使用 RDBMS,通常在事件存储模式中 data table),但我明白理想情况下它应该是通用的。

一个事件中应该存在的最基本的fields/properties是什么?

我曾考虑使用 json-api 作为我的活动的规范,但也许 "heavy" 太过分了。我看到的好处是灵活性和成熟度。

我正朝着 "wrong path" 前进吗?

任何明确定义的示例将不胜感激。

仅使用映射到 Json 的基本类型进行建模,就像编写 API 一样可以大有帮助。

如果您使用太多工具,您可能会花费大量时间生成过于复杂的模型 - 诸如 Apache Thrift and/or Protocol Buffers(或派生的东西)之类的东西将为您提供各种 IDL 机制产生附带的复杂性。

在 .NET 领域和许多其他平台中,如果您为类型命名空间,您可以从类型进行各种投影

就个人而言,我使用 F# 中的记录和 DU 作为设计和表示工具

  • 您可以免费获得 intellisense、语法高亮显示和可以从 F# 或 C# 使用的类型
  • 如果有人想看,types.fs 应有尽有

I've contemplated using json-api as a specification for my events but perhaps that's too "heavy". The benefits I see are flexibility and maturity.

Am I heading down the "wrong path"?

不要忽视向前和向后兼容性。

您应该计划在 event versioning 上复习 Greg Young 的书;它没有直接回答你的问题,但它确实涵盖了很多关于解释事件的基础知识。

简短回答:几乎所有内容都是可选的,因为您以后需要能够更改它。

您还应该查看 Hohpe 的企业集成模式,尤其是他在 messaging 方面的工作,其中详细介绍了您可能关心的许多案例。

de Graauw 的 Nobody Needs Reliable Messaging 帮助我理解了一个重要的观点。

To summarize: if reliability is important on the business level, do it on the business level.

因此,虽然您可能想要进行一些有趣的元数据跟踪,但域模型实际上只会查看 数据;这往往会特定于您的域。

感到有趣的是,您在生成事件的服务中使用的事件表示可能与它与其他服务共享的表示不匹配,尤其是可能与广播的消息不同。

我完成了一个练习,试图找出订户查看事件以了解其是否关心所需的最少信息量。我的答案是一个 id(我以前见过这个特定事件吗?),一个告诉你消息语义的标记(这是我关心的东西吗?),以及一个位置(URI)以获得更丰富的表示,如果它是我关心的事情。

但在域之外——例如,当您将系统作为一个整体来查看,试图找出正在发生的事情时,具有相关标识符和因果标识符、时间戳、源位置的签名,等等存储在元数据中的一致位置可能会有很大帮助。