1. acks=0
- 可靠性最低
- 生產者發送消息后不等待任何Broker確認
- 可能丟失消息(Broker處理失敗/網絡丟失時無法感知)
- 吞吐量最高,適用于允許數據丟失的場景(如日志收集)
2. acks=1 (默認值)
- Leader副本確認模式
- 生產者等待Leader副本寫入本地log后確認
- 可能丟失數據(Leader寫入后但其他副本未同步時Leader宕機)
- 在可靠性和吞吐量之間取得平衡
3. acks=all (或 -1)
- 最高可靠性
- 生產者等待所有ISR(In-Sync Replicas)副本確認
- 需要配合
min.insync.replicas
參數使用(建議 >=2) - 確保消息被所有ISR副本持久化后才返回確認
- 吞吐量最低,但可防止任何副本故障導致的數據丟失
可靠性補充建議:
- 當使用
acks=all
時,建議設置retries > 0
啟用重試機制 - 配置
max.in.flight.requests.per.connection=1
保證消息順序 - 監控ISR集合大小,避免因副本掉線導致生產阻塞
// 典型可靠性配置示例
// ... existing code ...
props.put(ProducerConfig.ACKS_CONFIG, "all"); // <mcsymbol name="ACKS_CONFIG" filename="KafkaConfig.java" path="src/main/java/com/example/kafka/KafkaConfig.java" startline="5" type="field"></mcsymbol>
// 要求所有ISR副本確認寫入(最高可靠性保證)
// 需配合min.insync.replicas=2使用,防止單點故障props.put(ProducerConfig.RETRIES_CONFIG, Integer.MAX_VALUE); // <mcsymbol name="RETRIES_CONFIG" filename="KafkaConfig.java" path="src/main/java/com/example/kafka/KafkaConfig.java" startline="6" type="field"></mcsymbol>
// 設置無限次重試(需配合delivery.timeout.ms參數)
// 當遇到可恢復錯誤時(如Leader選舉、網絡抖動)持續重試props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); // <mcsymbol name="ENABLE_IDEMPOTENCE_CONFIG" filename="KafkaConfig.java" path="src/main/java/com/example/kafka/KafkaConfig.java" startline="7" type="field"></mcsymbol>
// 啟用冪等性生產(自動去重機制)
// 通過producerId+sequenceNumber實現精確一次語義(EOS)props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, 1); // <mcsymbol name="MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION" filename="KafkaConfig.java" path="src/main/java/com/example/kafka/KafkaConfig.java" startline="8" type="field"></mcsymbol>
// 限制單個連接未確認請求數為1(保證消息順序)
// 可能降低吞吐量但避免消息亂序
// ... existing code ...