首页 > 解决方案 > 幂等和事务

问题描述

我正在探索 Kafka 中的事务,我想了解所有细节。

我注意到在 Spring-Kafka 中,当您提供 transactionalId 时启用了幂等性。

public void setTransactionIdPrefix(String transactionIdPrefix) {
    Assert.notNull(transactionIdPrefix, "'transactionIdPrefix' cannot be null");
    this.transactionIdPrefix = transactionIdPrefix;
    enableIdempotentBehaviour();
}

乍一看,我假设 Spring-Kafka 在事务中启用了幂等性,因为它是“物有所值”的。我认为这是为了确保在事务中确保一次性语义。

我做了更多的挖掘,发现事务需要幂等才能工作。这在KIP-98中提到

请注意,如果配置了 TransactionalId,则必须启用 enable.idempotence。

Kafka 幂等性是一种避免重复消息的功能,例如消息发送后的网络错误。

我的理解是,Kafka 事务基本上写入一个内部主题,并且必须启用幂等以避免重复。

幂等为生产者启用了一次性语义。

事务为传递性启用了一次性语义;消费 -> 生产。

我的理解正确吗?

什么只为消费者启用一次?提交偏移、幂等或事务。

标签: apache-kafkaspring-kafka

解决方案


幂等生产者针对单个主题为生产者启用一次。基本上,每条消息发送都有更严格的保证,并且在出现错误的情况下不会重复。

另一方面,事务生产者可以将多个发送(可以跨多个分区)组合在一起,并应用所有发送(或不应用)。事务还可以包含偏移提交(最终提交偏移与写入主题相同)。

因为消费者从 Kafka 获取数据,所以它已经是一次。当消费者从偏移量 N 向 Kafka 请求消息时,如果没有收到,它只会重试,不能有任何重复。消费者唯一需要的是提交偏移量,这可以由事务生产者完成(消费者需要将其当前的偏移量传递给生产者)。


推荐阅读