Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka ApacheKafka中的事件源_Apache Kafka_Event Sourcing - Fatal编程技术网

Apache kafka ApacheKafka中的事件源

Apache kafka ApacheKafka中的事件源,apache-kafka,event-sourcing,Apache Kafka,Event Sourcing,将Kafka用作事件存储效果很好,只需将消息保留设置为无限即可 但我也看到一些关于卡夫卡被用于活动来源的报道。 这就是我对如何实现这一点感到困惑的地方。 作为一个活动商店,我可以把我的信息塞进去。并根据需要消费或重播 但对于事件源,您很可能希望读取给定实体/聚合ID的事件。 当然,您可以使用分区,但这似乎滥用了这个概念,而且实际上很难添加新的实体,因为分区计数更多地是静态的,即使您可以更改它。 有什么明智的解决办法吗? ApacheKafka文档本身只是简单地提到了事件源。我认为ApacheKa

将Kafka用作事件存储效果很好,只需将消息保留设置为无限即可

但我也看到一些关于卡夫卡被用于活动来源的报道。 这就是我对如何实现这一点感到困惑的地方。 作为一个活动商店,我可以把我的信息塞进去。并根据需要消费或重播

但对于事件源,您很可能希望读取给定实体/聚合ID的事件。 当然,您可以使用分区,但这似乎滥用了这个概念,而且实际上很难添加新的实体,因为分区计数更多地是静态的,即使您可以更改它。 有什么明智的解决办法吗?
ApacheKafka文档本身只是简单地提到了事件源。

我认为ApacheKafka是存储事件源的最佳解决方案。活动来源的概念非常接近,通常与Greg Young提出的名为CQRS的概念/实践一起工作,我建议您进行研究

我在这个答案中使用的术语repository是埃里克·埃文斯(Eric Evans)书中提到的领域驱动设计方面的存储库

我想我知道你困惑的原因是什么

但对于事件源,您很可能希望读取给定实体/聚合ID的事件

我认为你的上述问题是正确的。但我认为你想表达一些不同的东西。你想表达这样的意思:

在事件源中,当要求存储库从其数据源检索对象时,存储库必须在对存储库的每个请求中检索构成特定实体的所有事件。然后必须重播这些事件以构建对象

这真的是你想要表达的吗?因为我认为上面的句子是假的

不需要每次检索对象时都重新生成它。

换句话说,您不需要在每次从存储库检索对象时重播构成该对象的所有事件。您可以播放对象上的事件,并以不同的方式存储对象的当前版本,例如,在缓存中,或者更好地在缓存和卡夫卡中

我们来举个例子。假设我们有一辆装载和卸载的履带/卡车

活动的主流将是操作——这将是我们应用程序中的第一个卡夫卡主题。这将是我们的真相来源,正如杰伊·克雷普斯通常在他的论文中所说的那样

这些活动包括:

  • 轨道1装有清管器
  • 轨道2装有清管器
  • 轨道2从清管器上卸载
  • 2号跑道装满了沙子
  • 轨道1从清管器上卸载
  • 第1轨道装载着鲜花
最终的结果是轨道1填充了花朵,轨道2填充了沙子

您要做的是阅读本主题中的事件并填充第二个主题:trackUpdated。您流入trackUpdated主题的事件如下:

  • 轨道1:猪
  • 轨道2:猪
  • 轨道2:什么都没有
  • 轨道2:沙
  • 轨道1:什么都没有
  • 轨道1:鲜花
同时,随着每条消息的使用,您将更新缓存中卡车的当前版本,例如memcached。所以memcache将是存储库用于检索跟踪对象的直接源

此外,您还将trackUpdated主题压缩为一个主题

阅读ApacheKafka官方文档中的压缩主题。在Confluent博客和Linkedin工程博客(Confluent公司成立之前)上有很多关于它的有趣材料

因此,由于trackUpdated是兼容的,卡夫卡在一段时间后看起来是这样的:

  • 轨道2:沙
  • 轨道1:鲜花
如果您使用track ID作为所有消息的键,Kafka将执行此操作-在文档中读取消息“键”是什么。因此,每首曲目都会有一条消息。如果您在应用程序中发现bug,您可以重播操作主题以填充缓存,并再次跟踪更新主题。如果缓存停止,可以使用trackUpdated主题填充缓存

你觉得怎么样?投票和评论受到高度欢迎

更新: (1) 经过一些思考,我改变了主意,你的一句话是真的。我现在发现它是假的。所以我不**((认为对于事件源,您最有可能希望读取给定实体/聚合ID的事件

当您在代码中发现一个bug时,您希望重播所有对象的所有事件。在我的简单示例中,有2个实体还是有10万个实体并不重要

事件来源不是检索特定实体的所有事件。事件来源是指您拥有所有事件的审核日志,并且能够重播这些事件以重建实体。您不需要重建单个特定实体

(2) 强烈建议大家熟悉Confluent和LinkedIn工程博客的一些博文。以下内容对我来说非常有趣:


卡夫卡官方文档也是必须的。

关于您对另一个问题的评论:


谢谢你的努力,答案很离题,“这真的是你想要表达的吗?”不。问题不在于DDD或CQR。我对它们很熟悉。我在问如何或是否可以使用Kafka进行事件处理。假设我有1000万个实体,我可能不想让它们同时跨服务器加载到内存中。我可以使用Kafka加载单个聚合的数据而不重放所有内容吗

答案是肯定的:您可以使用来处理事件。您的streams逻辑生成聚合并将它们存储在本地状态存储(RocksDB)中,因此生成的聚合不需要