当前位置: 首页 > 知识库问答 >
问题:

基于Kafka的事件源并发写

龚铭
2023-03-14

我一直在考虑使用Apache Kafka作为事件源配置中的事件存储。发布的事件将与特定的资源相关联,传递到与资源类型相关联的主题,并按资源ID分片到分区中。因此,例如,创建类型为Folder和id 1的资源将产生一个FolderCreate事件,该事件将通过在主题中的分区总数中对id 1进行分片来传递到给定分区中的“Folders”主题。即使我不知道如何处理使日志不一致的并发事件。

最简单的场景是有两个并发操作,它们可以使彼此无效,例如一个更新文件夹,一个销毁同一个文件夹。在这种情况下,该主题的分区最终可能包含无效序列[FolderDestroy,FolderUpdate]。这种情况通常通过对事件进行版本化来解决,正如这里所解释的那样,但是Kafka不支持这样的特性。

共有1个答案

胡野
2023-03-14

我认为可能可以使用Kafka作为聚合(在DDD意义上)或“资源”的事件来源。一些注意事项:

  1. 序列化每个分区的写操作,使用每个分区(或多个分区)的单个进程来管理此操作。确保在同一个Kafka连接上连续发送消息,如果您负担不起回滚,在向命令发送者报告成功之前使用ACK=ALL。确保生产者进程跟踪每个资源的当前成功事件偏移量/版本,以便在发送消息之前进行乐观检查。
  2. 由于即使写操作实际成功也可能返回写操作失败,因此您需要重试写操作并通过在每个事件中包含ID来处理重复数据删除,或者通过重新读取流中的(最近的消息)来重新初始化生成器,以查看写操作是否实际有效。
  3. 以原子方式编写多个事件-只需发布一个包含事件列表的复合事件。
  4. 按资源ID查找。这可以通过在启动时从分区读取所有事件(或从特定跨资源快照读取所有事件),并将当前状态存储在RAM中或缓存在DB中来实现。

https://issues.apache.org/jira/browse/kafka-2260将以更简单的方式解决1,但似乎停滞不前。

Kafka Streams似乎为您提供了很多这方面的内容。例如,4是一个KTable,您可以让事件生成器在发送事件之前使用它来确定事件对于当前资源状态是否有效。

 类似资料:
  • 我了解了如何通过使用Apache Kafka作为事件代理来实现事件源。(链接到融合文章)

  • 我一直在读关于微服务和事件来源的文章,以及它是如何将服务从另一个服务中分离出来的。有两个概念我不清楚。首先,如果在微服务体系结构中,每个服务都可以独立开发,我们如何解释服务间的通信依赖? 例如,如果服务A和服务B需要通信,那么A需要将一个事件发送到一个中央总线,而B需要监听该事件并根据该事件采取行动,但这似乎会产生很多依赖关系。现在,如果我正在开发服务B,我需要知道服务A可以生成的所有事件。此外,

  • 在我发布配置之后,当我执行HTTP curl时,状态是。在worker的日志中也没有错误日志,当我检查它时,在kafka主题中也没有数据。当我尝试做一个控制台-消费者时,我还尝试了其他几种组合,比如在。 我尝试的另一件事是使用这两个链接https://rmoff.net/2018/05/21/kafka-connect-and-oracle-data-types/https://www.confl

  • 这个问题类似于将Kafka用作CQRS EventStore。好主意?,但更具体的实现。当我有数千个事件“源”(DDD中的聚合根)时,如何使用kafka作为事件存储?正如我在链接问题和其他一些地方读到的,我会有每个来源的主题的问题。如果我将事件按类型拆分到主题中,它将更容易使用和存储,但我需要访问特定源的事件流。如何用Kafka做事件来源?

  • 我试图在Kafka流之上实现一个简单的CQRS/Event sourcing概念验证(如https://www.confluent.io/blog/event-sourcing-using-apache-kafka/所述) 我有4个基本部分: 命令处理器-命令流,左与聚合状态KTABLE连接。对于结果流中的每个条目,使用函数生成结果事件,并将它们发布到主题 问题是--有没有办法确保我在州存储中有聚

  • 在实现基于事件源的微服务时,我们遇到的主要问题之一是聚合响应数据。例如,我们可能有两个实体,如学校和学生。一个微服务可能负责处理学校相关的业务逻辑,而另一个微服务可能处理学生。 现在,如果有人通过RESTendpoint进行查询并询问某个特定的学生,他们可能希望了解学校和学生的详细信息,那么对我来说,唯一已知的方法是以下方法。 > 使用类似于服务链接的东西。一个例子是Api-Gateway在向几个