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

标签 apache-kafka kafka-consumer-api

我开始学习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/

相关文章:

spring-boot - Kafka中不同消费者有不同的重试策略

javascript - 使用kafka-node消费消息时接收垃圾字符

java - 两个 Kafka 消费者互相造成奇怪的行为

java - @KafkaListener 正常关闭,批处理 Kakfa 监听器不工作

spring-boot - 如何在kafka监听器方法中寻找特定的偏移量?

apache-kafka - 在 Kafka Connect HDFS Sink 中按多个嵌套字段进行分区

java - 如何解析来自Storm方案类中kafka主题的json数据?

java - KafkaConsumer 0.10 Java API错误消息: No current assignment for partition

apache-kafka - 我们如何将相同键的所有值合并为一个列表,并返回键和值为字符串的 Kafka Streams

java - 如何在 Java 中创建 Kafka ZKStringSerializer?