所谓的消息交付可靠性保障,是指 Kafka 对 Producer 和 Consumer 要处理的消息提供什么样的承诺。常见的承诺有以下三种:
- 最多一次(at most once):消息可能会丢失,但绝不会被重复发送。
- 至少一次(at least once):消息不会丢失,但有可能被重复发送。
- 精确一次(exactly once):消息不会丢失,也不会被重复发送。
目前,Kafka 默认提供的交付可靠性保障是第二种,即至少一次。
只有 Broker 成功“提交”消息且 Producer 接到 Broker 的应答才会认为该消息成功发送。不过倘若消息成功“提交”,但 Broker 的应答没有成功发送回 Producer 端(比如网络出现瞬时抖动),那么 Producer 就无法确定消息是否真的提交成功了。因此,它只能选择重试,也就是再次发送相同的消息。这就是 Kafka 默认提供至少一次可靠性保障的原因,不过这会导致消息重复发送。
精确一次:即使 Producer 端重复发送了相同的消息,Broker 端也能做到自动去重。在下游 Consumer 看来,消息依然只有一条。
Kafka 是怎么做到精确一次的呢?简单来说,这是通过两种机制:幂等性(Idempotence)和事务(Transaction)。
在 Kafka 中,Producer 默认不是幂等性的,但我们可以创建幂等性 Producer。在 0.11 之后,指定 Producer 幂等性的方法很简单,仅需要设置一个参数即可,即 props.put(“

Kafka 的消息交付可靠性包括最多一次、至少一次和精确一次。默认提供至少一次保障,可能导致消息重复。通过幂等性Producer可避免消息重复,但仅限单分区和单会话。启用幂等性需设置 `enable.idempotence=true`。事务型Producer支持多分区和跨会话的精确一次处理,需设置 `enable.idempotence=true` 和 `transactional.id`,并调整代码以使用事务。Consumer端需设置 `isolation.level=read_committed` 以读取已提交事务。
最低0.47元/天 解锁文章
7283

被折叠的 条评论
为什么被折叠?



