Apache kafka ApacheKafka中的事件源
将Kafka用作事件存储效果很好,只需将消息保留设置为无限即可 但我也看到一些关于卡夫卡被用于活动来源的报道。 这就是我对如何实现这一点感到困惑的地方。 作为一个活动商店,我可以把我的信息塞进去。并根据需要消费或重播 但对于事件源,您很可能希望读取给定实体/聚合ID的事件。 当然,您可以使用分区,但这似乎滥用了这个概念,而且实际上很难添加新的实体,因为分区计数更多地是静态的,即使您可以更改它。 有什么明智的解决办法吗?Apache kafka ApacheKafka中的事件源,apache-kafka,event-sourcing,Apache Kafka,Event Sourcing,将Kafka用作事件存储效果很好,只需将消息保留设置为无限即可 但我也看到一些关于卡夫卡被用于活动来源的报道。 这就是我对如何实现这一点感到困惑的地方。 作为一个活动商店,我可以把我的信息塞进去。并根据需要消费或重播 但对于事件源,您很可能希望读取给定实体/聚合ID的事件。 当然,您可以使用分区,但这似乎滥用了这个概念,而且实际上很难添加新的实体,因为分区计数更多地是静态的,即使您可以更改它。 有什么明智的解决办法吗? ApacheKafka文档本身只是简单地提到了事件源。我认为ApacheKa
ApacheKafka文档本身只是简单地提到了事件源。我认为ApacheKafka是存储事件源的最佳解决方案。活动来源的概念非常接近,通常与Greg Young提出的名为CQRS的概念/实践一起工作,我建议您进行研究 我在这个答案中使用的术语repository是埃里克·埃文斯(Eric Evans)书中提到的领域驱动设计方面的存储库 我想我知道你困惑的原因是什么 但对于事件源,您很可能希望读取给定实体/聚合ID的事件 我认为你的上述问题是正确的。但我认为你想表达一些不同的东西。你想表达这样的意思: 在事件源中,当要求存储库从其数据源检索对象时,存储库必须在对存储库的每个请求中检索构成特定实体的所有事件。然后必须重播这些事件以构建对象 这真的是你想要表达的吗?因为我认为上面的句子是假的 不需要每次检索对象时都重新生成它。 换句话说,您不需要在每次从存储库检索对象时重播构成该对象的所有事件。您可以播放对象上的事件,并以不同的方式存储对象的当前版本,例如,在缓存中,或者更好地在缓存和卡夫卡中 我们来举个例子。假设我们有一辆装载和卸载的履带/卡车 活动的主流将是操作——这将是我们应用程序中的第一个卡夫卡主题。这将是我们的真相来源,正如杰伊·克雷普斯通常在他的论文中所说的那样 这些活动包括:
- 轨道1装有清管器
- 轨道2装有清管器
- 轨道2从清管器上卸载
- 2号跑道装满了沙子
- 轨道1从清管器上卸载
- 第1轨道装载着鲜花
- 轨道1:猪
- 轨道2:猪
- 轨道2:什么都没有
- 轨道2:沙
- 轨道1:什么都没有
- 轨道1:鲜花
- 轨道2:沙
- 轨道1:鲜花
卡夫卡官方文档也是必须的。关于您对另一个问题的评论:
谢谢你的努力,答案很离题,“这真的是你想要表达的吗?”不。问题不在于DDD或CQR。我对它们很熟悉。我在问如何或是否可以使用Kafka进行事件处理。假设我有1000万个实体,我可能不想让它们同时跨服务器加载到内存中。我可以使用Kafka加载单个聚合的数据而不重放所有内容吗 答案是肯定的:您可以使用来处理事件。您的streams逻辑生成聚合并将它们存储在本地状态存储(RocksDB)中,因此生成的聚合不需要