一、Kafka 消息交付可靠性
Kafka 对Producer和Consumer 需要处理的消息提供三种承诺:
- 最多一次(at most once):消息可能丢失,但绝不会被重发;
- 至少一次(at least once):消息不会丢失,但有可能被重复发送(默认此可靠性);
- 精确一次(at most once):消息不会丢失,也不会被重复发送。
目前,Kafka默认提供的交付可靠性保障是第二种,即至少一次。Producer 发送消息后,没有收到 Broker的callback,就会发起重试,发送相同的消息到Broker。
二、幂等性 Producer
在Kafka中,Producer 默认不是幂等性的,但我们可以闯进幂等性Producer。在0.11 版本之后,添加一个参数即可实现幂等性,即 props.put(“enable.idempotence”,true)或props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG,true)。
设置参数后,Kafka 自动帮你做消息的重复去重。底层实现原理很简单,就是典型的空间去换时间的优化思路,即在Broker端多保存一些字段。当Producer 发送相同字段值的消息后,Broker能够自动知晓这消息已经去重复了, 于是可以在后台默默的把它们"丢弃"掉。
Producer 幂等性只能保证单分区上的幂等性,即保证某一个分区上不出现重复消息,它无法实现多分区的