簡體   English   中英

如何在 Spring Boot 中設置 Kafka 冪等生產者?

[英]How to setup Kafka Idempotent Producer in Spring Boot?

我們希望使用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 一起工作?

我的配置中缺少什么?

Exactly Once Semantics 不能那樣工作,

冪等生產者的配置是為了在生產者在過程中失敗時避免重復或亂序的行,

考慮以下場景:您向主題發送消息,您的生產者客戶端正在等待來自代理的確認,消息已寫入 kafka,但現在出現網絡錯誤並且從未收到生產者客戶端的確認,您的生產者會這樣做內部重試以生成消息,消息將再次發送給代理,

如果您沒有啟用 idemptance,那么您的經紀人將再次寫入消息並向您發送確認,您將在主題內收到重復的消息,

如果您啟用了 idemptance,代理會理解這是生產者的重試,並且消息已經寫入主題,他只會向您發送確認,主題中沒有重復。

在您的測試中,您只生成 3 條具有相同值的消息,它們是不同的“線程”……因此您最終將在該主題中有 3 條消息

為了您的信息,apache kafka 項目非常密集地檢查他們添加的所有內容以避免任何破壞性更改,它非常穩定,您可以通過此鏈接查看他們如何測試 idemptance producer 功能

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM