gpt4 book ai didi

apache-kafka - 在 Kafka 之上并发写入事件源

转载 作者:行者123 更新时间:2023-12-04 04:46:26 25 4
gpt4 key购买 nike

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

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

在这些情况下,如何确保 Kafka 日志本身的一致性?

最佳答案

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

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

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

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

    关于apache-kafka - 在 Kafka 之上并发写入事件源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44358694/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com