我正在卡夫卡(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事务基本上是写一个内部主题,必须启用幂等才能避免重复。
幂等对生产者启用一次语义。
Transactions为传递性启用了一次精确的语义;消费->生产。
我的理解正确吗?
是什么让一次消费者仅能一次?提交偏移量,幂等或事务。
答案 0 :(得分:3)
幂等生产者可以针对单个主题为生产者启用一次。基本上,每条发送的邮件都有gerger保证,在出现错误的情况下不会重复。
另一方面,事务生成器可以将多个发送(可以跨越多个分区)组合在一起,并应用所有发送(或不应用任何发送)。事务还可以包含偏移量提交(最后,提交偏移量与写入主题相同)。
由于消费者从Kafka提取数据,因此已经只有一次。当消费者从偏移量N询问Kafka消息时,如果它没有接收到消息,它将重试,没有任何重复。 COnsumers唯一需要的一次就是提交偏移量,这可以由交易生产者完成(消费者需要将其当前的偏移量传递给生产者)。