【问题标题】:Kafka Transactional Producer & ConsumerKafka 事务生产者和消费者
【发布时间】:2019-01-15 21:19:54
【问题描述】:

Kafka 为每条消息生成偏移量。比如说,我正在生成消息 5,偏移量将从 1 到 5。

但是,在事务生产者中,比如说,我产生了 5 条消息并提交,然后 5 条消息但被中止,然后 5 条消息提交。

  1. 那么,最后提交的 5 条消息的偏移量将从 6 到 10 或 11 到 15?

  2. 如果我不中止或不提交怎么办。消息还会发布吗?

  3. Kafka 如何忽略未提交的偏移量?因为,kafka 提交日志是基于偏移量的。它是否使用事务提交日志让事务消费者提交偏移量并返回最后一个稳定的偏移量?或者,它来自维护偏移量的 __transaction_state 主题?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:
    1. 最后 5 条消息的偏移量为 11 到 15。当使用 isolation.level=read_committed 消费时,消费者将从偏移量 6“跳转”到 11。

    2. 如果您不提交或中止事务,它将在transaction.max.timeout.ms 过去后自动超时(中止)。

    3. 与消息数据一起,Kafka 存储了一堆元数据,并且能够识别每条消息是否已提交。由于提交偏移量与写入分区相同(唯一的区别是它由 Kafka 在内部主题 __consumer_offsets 中自动完成)它对偏移量的工作方式相同。通过sendOffsetsToTransaction() 添加的已中止或未提交的偏移量将被自动跳过。

    正如您在另一个问题中提到的那样,我建议您看一下为 Kafka 添加了一次性语义的 KIP。它详细介绍了所有这些机制,并将帮助您更好地理解:https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging

    【讨论】:

      猜你喜欢
      • 2018-02-08
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2019-10-16
      • 2018-12-18
      • 1970-01-01
      相关资源
      最近更新 更多