gpt4 book ai didi

apache-kafka - 卡夫卡 : Is it good practice too keep topic offset in database?

转载 作者:行者123 更新时间:2023-12-02 00:12:57 26 4
gpt4 key购买 nike

我开始学习kafka了。我对使用 kafka 的现场项目不太了解。想知道除了在代理中提交之外,偏移量是否可以保存在数据库中?我认为应该始终保存它,否则会丢失或重新处理某些记录。举个例子,如果偏移量没有保存在数据库中,当应用程序(消费者)被部署或重新启动时,如果当时有消息被发送到代理,那将被错过,因为当消费者启动时,它将读取下一个向前的记录或(从头开始)

最佳答案

对您的问题的简短回答是“它很复杂”:-)

你问题的长答案是这样的:

  1. kafka(无需额外配置和/或精心设计代码)是一个至少一次的系统(参见 official documentation)。这意味着是的,您的消费者可能不止一次看到一组特定的记录。这不会发生在正常关闭/重新平衡时,但如果您的应用程序崩溃肯定会发生。
  2. kafka 的新版本支持所谓的“exactly once”。这涉及configuring your clients differently (以及显着的性能和延迟影响),并且保证只有如果您的所有输入和输出都来自/到完全相同的 kafka 集群。因此,如果您的消费者执行任何操作,例如调用外部 HTTP API 或插入数据库以响应看到的 kafka 记录,我们将返回至少一次。
  3. 如果您的输出进入事务系统(如经典的 ACID 数据库),常见的模式是启动一个事务,并在该事务中记录您的输出和消费者抵消(您还需要将代码更改为从这些数据库偏移量而不是 kafka 默认值恢复)。这有更好的保证(但如果您的代码与非事务性系统交互,例如进行 HTTP 调用,仍然无济于事)
  4. 另一种至少要克服一次的常见设计模式是以某种方式“标记”你所做的每一个操作(你制作的记录,你进行的 http 调用......),其中一些 UUID 来自原始的 kafka 记录,这些 UUID 用于生成这个输出。这意味着如果您的消费者再次看到相同的记录,它将再次执行相同的操作,并重复相同的“标签”值。这将负担转移到下游系统,下游系统现在必须记住(至少在一段时间内)他们看到的所有“标签”,以便他们可以忽略重复操作,或者以某种方式将您的所有操作设计为幂等

关于apache-kafka - 卡夫卡 : Is it good practice too keep topic offset in database?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58255598/

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