如何在spring boot中设置kafka幂等生产者?

1qczuiv0  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(401)

我们希望使用 exactly-once 语义,以避免消息重复。具有以下属性的生产者:

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条消息。
我怎样才能让你和Kafka一起工作呢?
我的配置中缺少什么?

2skhul33

2skhul331#

准确地说,一旦语义不工作,幂等制作者被配置为避免复制或无序的行,当制作者在这个过程中失败时,考虑下面的场景:你向主题发送消息,你的制作人客户正在等待经纪人的确认,消息被写到Kafka,但是现在出现网络错误,并且从未向producer客户端收到确认,您的producer将进行内部重试以生成消息,消息将再次发送到代理,如果您未启用idemptance,则代理将再次写入消息并向您发送确认,您将在主题内收到重复的消息,如果您启用idemptance,代理将理解这是生产者的重试,并且消息已写入主题,他只会向您发送确认,主题中没有重复消息。
在您的测试中,您只生成3条具有相同值的消息,它们是不同的“线程”。。。因此,您将在主题中得到3条消息

相关问题