【问题标题】:How to setup Kafka Idempotent Producer in Spring Boot?如何在 Spring Boot 中设置 Kafka 幂等生产者?
【发布时间】:2021-07-28 19:45:18
【问题描述】:

我们希望使用 exactly-once 语义将数据存储在 Kafka 中,以避免消息重复。 具有以下属性的生产者:

spring.kafka.producer.properties.acks=all
spring.kafka.producer.properties.enable.idempotence=true

Kafka 主题说明:

Topic: topicName    PartitionCount: 1   ReplicationFactor: 1    
Configs: Topic: topicName   Partition: 0    Leader: 1   Replicas: 1 Isr: 1

集成测试:

  @Test
  void exactlyOnceTest() {
    kafkaTemplate.send("topicName", "key", "data");
    kafkaTemplate.send("topicName", "key", "data");
    kafkaTemplate.send("topicName", "key", "data");
  }

我们的预期是Kafka中应该只存储一条消息,但实际结果是3条消息。

如何使 excatly-once 语义与 Kafka 一起使用?

我的配置中缺少什么?

【问题讨论】:

    标签: java spring spring-boot apache-kafka idempotent


    【解决方案1】:

    一旦语义不能那样工作,

    配置幂等生产者是为了避免生产者在进程中失败时出现重复或乱序的行,

    考虑以下场景: 您向主题发送消息, 您的生产者客户正在等待经纪人的确认, 消息被写入kafka, 但是现在出现网络错误,并且从未收到生产者客户端的确认, 您的生产者将进行内部重试以生成消息, 消息将再次发送给代理,

    如果您没有启用 idemptance,那么您的代理将再次写入消息并向您发送确认, 您将在主题内收到重复的消息,

    如果您启用了 idempance,broker 将理解这是生产者的重试,并且消息已经写入主题,他只会向您发送确认,主题中没有重复。

    在您的测试中,您只需生成 3 条具有相同值的消息,它们是不同的“线程”......因此您最终将在主题中拥有 3 条消息

    为了您的信息,apache kafka 项目正在非常密集地检查他们添加的所有内容以避免任何重大更改,它非常稳定,您可以通过此链接查看他们如何测试 idempance producer 功能

    https://github.com/apache/kafka/blob/c5ec390fa6fded24dee5d699a0ec87a5345a4e99/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java#L160

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 2016-04-11
      • 2021-09-22
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多