【问题标题】:Idempotent and Transactions幂等和事务
【发布时间】:2018-07-30 09:00:34
【问题描述】:

我正在研究 Kafka 中的 Transactions,我想了解所有细节。

我注意到在 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 事务基本上写入一个内部主题,必须启用幂等以避免重复。

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

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

我的理解正确吗?

什么东西只对消费者启用了exactly-once?提交偏移、幂等或事务。

【问题讨论】:

    标签: apache-kafka spring-kafka


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我有点跳过了帖子中多个主题的部分。对消费者来说非常正确-一次-它有点含蓄。你知道为什么必须为事务启用幂等吗?是否只是为了确保内部__transaction_state 的事务状态不重复?有更深层次的技术原因吗?我已经阅读了很多 KIP,并且非常模糊为什么幂等是事务的要求,这就是为什么我认为它只是确保重复数据删除。
    • 事务比幂等性高一个层次。幂等性确保每条消息只传递一次,而事务确保它们也都分组在一起。
    • 好的。那么为什么 Kafka 中的事务需要幂等性呢?
    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多