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 ...