4

我非常开始使用/理解EventStore或 get-event-store ,因为它可能在这里知道。

我已经阅读了有关客户、预测和订阅的文档,并准备开始在一些内部项目中使用。

我无法完全理解的一件事-是否有指南/一组建议来描述事件元数据和数据之间的区别?我知道名义上的差异;事件数据是领域的“核心”,用于描述的元数据,但它变得非常哲学化。

我想知道是否有关于实施(查询等)的硬性规则。

任何指导都感激不尽!

4

2 回答 2

2

从Szymon Kulec的博客文章“用重要的元数据丰富你的事件”(强调我的)中无耻地复制(和解释)部分内容:

但是,哪些信息可以用于存储在元数据中,哪些信息值得存储,尽管在创建模型时并未捕获这些信息?

1. 审计数据

  • 谁?– 只需存储动作调用者的用户 ID
  • 什么时候?– 动作和事件的时间戳
  • 为什么?– 演员的序列化意图/动作

2. 事件版本控制

事件溯源处理动作的效果。根据当前实现,对状态执行的动作会导致动作。等待。目前的实施?是的,聚合的实现可能会发生变化,这可能是由于错误修复或引入新功能。如果版本(例如提交 ID(对于 gitters 的 SHA1)或语义版本)也可以与事件一起存储,那不是很好吗?想象一下,您发布了一个损坏的版本,并且您的企业在修复错误之前售出了 100 张票。如果能够根据损坏的实现创建哪些事件,那就太好了。有了这些知识,您可以轻松地补偿由损坏的实现执行的事务。

3.文档实现细节

为用户引入金丝雀版本、功能切换和 A/B 测试是很常见的。通过自动部署和小代码增强,所有提到的方法都可以在项目板上使用。如果您考虑切换或不同的实现在同一时刻共存,那么仅存储版本可能是不够的。如何添加信息,哪些功能适用于该操作?只需创建一组简单的启用功能,或映射功能状态并将其添加到事件中。有了这个和命令,就很容易重复这个过程。此外,很容易导致您的 A/B 实验。只需对启用 A 的事件运行扫描,对 B 运行另一个扫描。

4. 2.和3.的优化组合。

如果您认为这太过分了,请创建一组版本 x 功能的查找。它不是那么大,并且可以在许多用户之间重复,因此您可以轻松地优化将集合存储在引用键下的其他位置。您可以序列化此映射并计算 SHA1,将值放入映射(表也可以)并使用标识符将它们放入事件中。有很多选项可以将负载转移到查询(查找)或存储(将所有内容存储为命名元数据)。

加起来

如果您创建事件源架构,请考虑将时间维度(版本)和一些配置添加到元数据中。一旦有了它,就可以更容易地推断事件的来源并引入补偿等工具。没有像太多数据这样的事情,是吗?

于 2019-01-10T14:26:27.660 回答
2

我将与您分享我的经验,这可能会有所帮助。我一直在玩 akka-persistence、akka-persistence-eventstore 和 eventstore。akka-persistence 以二进制格式存储它的事件包装器 PersistentRepr。我想要 JSON 格式的这些数据,以便我可以:

  • 使用投影
  • 使这些事件易于用于任何其他技术

您可以为 akka-persistence-eventstore 实现自己的序列化来执行此操作,但它最终仍然只是存储将我的事件嵌入到有效负载属性中的包装器。其他属性都是 akka-persistence 特定的。akka-persistence-eventstore 的作者给了我一些很好的建议,让序列化器将 payload 存储为 Data,其余的存储为 MetaData。这样一来,我的事件现在只是业务数据,而元数据有助于将其放在首位的技术。我的预测现在不需要解析元数据来获取有效负载。

于 2015-09-04T10:59:55.650 回答