我正在探索Kafka的交易,我想了解所有的细节。
我在 Spring kafka中注意到,当您提供transactionsalid时,启用了幂等。
public void setTransactionIdPrefix(String transactionIdPrefix) {
Assert.notNull(transactionIdPrefix, "'transactionIdPrefix' cannot be null");
this.transactionIdPrefix = transactionIdPrefix;
enableIdempotentBehaviour();
}
乍一看,我假设SpringKafka在事务中启用了幂等元,因为它“很好拥有”。我认为这是为了确保在事务中只使用一次语义。
我做了更多的挖掘,发现事务需要幂等元才能工作。kip-98中提到了这一点
请注意,如果配置了transactionalid,则必须启用enable.幂等性。
Kafka幂等是一个功能,以避免重复的消息,如网络错误后,消息已被发送。
我的理解是,kafka事务基本上写一个内部主题,必须启用幂等项以避免重复。
幂等为生产者提供一次语义。
事务只支持一次语义的及物性;消费->生产。
我的理解正确吗?
什么只允许消费者使用一次?提交偏移、幂等或事务。
1条答案
按热度按时间oogrdqng1#
幂等生产者对一个生产者对一个主题只启用一次。基本上,每一个单独的消息发送都有更严格的保证,并且在出现错误时不会被复制。
另一方面,事务生产者允许将多个send(可以跨多个分区)组合在一起,并应用所有的send(或者不应用任何分区)。事务还可以包含偏移量提交(最终提交偏移量与写入主题相同)。
因为消费者从Kafka那里获取数据,这已经是一次了。当消费者询问来自偏移量n的kafka消息时,如果它没有收到它们,它只会重试,不会有任何重复。使用者只需要提交一次补偿,这可以由事务生产者完成(使用者需要将其当前补偿传递给生产者)。