是否可以将Apache Kafka“无限保留策略”用作具有CQRS的事件源系统的基础?

问题描述 投票:2回答:1

我目前正在评估用于设计/实施事件源+ CQRS体系结构系统设计方法的选项。由于我们想将Apache Kafka用于其他方面(正常的pubsub消息传递+流处理),因此下一个逻辑问题是“我们可以将Apache Kafka存储用作CQRS的事件存储吗?”,或更重要的是那是明智的选择吗?

目前,我不确定。该来源似乎支持它:https://www.confluent.io/blog/okay-store-data-apache-kafka/

此其他消息来源建议反对:https://medium.com/serialized-io/apache-kafka-is-not-for-event-sourcing-81735c3cf5c

在我目前的测试/实验中,我遇到的问题与第二个来源所描述的类似,这些问题是:

  1. 重组实体: Kafka似乎不支持快速检索/搜索主题内的特定事件(例如:与订单历史记录相关的所有命令-重建实体实例所必需的命令,要求扫描所有主题的事件,并仅过滤与某些实体实例标识符匹配的事件(这是不可行的)。 [[另一个人似乎已经得出了类似的结论:Query Kafka topic for specific record-也就是说,这是不可能的(不依靠某些骇人听闻的技巧)]
  2. -写一致性: Kafka不支持其存储上的事务原子性,因此在异步将事件异步导出到Kafka qeue之前,将数据库放入某种锁定方法(通常是乐观锁定)似乎是一种常见的做法。 (尽管我可以忍受,但第一个问题对我而言至关重要)。
  3. 分区问题:在Kafka文档中,提到“订单保证”仅存在于“主题的分区”中。同时,他们还说分区是并行性的基本单元,换句话说,如果您要并行化工作,请在分区(当然是代理)之间传播消息。但这是一个问题,因为事件源系统中的“事件存储”需要顺序保证,所以这意味着如果我绝对需要顺序保证,则只能在此用例中使用1个分区。这是正确的吗?

即使这个问题有点悬而未决,它的确是这样的:您是否使用Kafka作为事件源系统上的主要事件存储?您如何处理根据实体实例的命令历史来重组实体实例的问题(鉴于该主题有数百万个条目扫描所有集合的情况是不可行的)?您是否只使用了一个牺牲潜在并发使用者的分区(假设订购保证仅限于特定主题分区)?

任何具体或一般性的反馈意见都将受到极大的赞赏,因为这是一个复杂的主题,需要考虑多个方面。]

提前感谢。

编辑

6年前在这里进行了类似的讨论:Using Kafka as a (CQRS) Eventstore. Good idea?当时的共识也有所分歧,很多人认为这种方法很方便,并提到了Kafka如何原生处理大量实时数据。尽管如此,问题(至少对我而言)与之无关,而与卡夫卡重建实体状态的能力有多不便相关-要么通过将主题建模为实体实例(其中主题数量呈指数级增长是不希望的) ,或通过建模主题es实体类型(主题中的事件数量使重建非常缓慢/不切实际)。

我目前正在评估用于设计/实施事件源+ CQRS体系结构系统设计方法的选项。由于我们想将Apache Kafka用于其他方面(正常的pubsub消息传递...

apache-kafka apache-kafka-streams cqrs event-sourcing eventsource
1个回答
2
投票

您的理解大体上是正确的:

© www.soinside.com 2019 - 2024. All rights reserved.