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