精确一次处理语义
-
消息处理语义
- 最多一次(at most once):消息可能丢失也可能被处理,但最多只会处理一次
- 至少一次(at least once):消息不会丢失,但可能被处理多次
- 精确一次(exactly once):消息被处理且只会被处理一次
-
producer:
- 在
0.11.0.0
之前,kafka producer默认提供至少一次(at least once)语义(重试机制) - kafka在
0.11.0.0
开始引入producer精确一次性语义EOS(exactly-once semantics)。即瞬时发送错误导致的producer重试,在broker端这条消息只会被写入日志一次。如果要启用幂等性producer以及获取EOS语义,需要显示设置producer参数enable.idempotence=true
- 在
-
consumer:
- 最多一次(at most once): consumer首先获取消息,然后提交offset,之后再处理消息。当提交offset后,consumer崩溃,消息可能永远不会被处理,即消息丢失
- 至少一次(at least once):consumer先获取消息,然后处理消息,最后提交offset。当消息处理完,consumer崩溃,此时可能会重复处理
-
案例
@Test public void testIdempotence() { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-master:9092,kafka-slave1:9093,kafka-slave2:9094"); props.