gpt4 book ai didi

apache-kafka - kafka怎么知道 "roll forward or roll back"是否是一笔交易?

转载 作者:行者123 更新时间:2023-12-05 04:00:31 27 4
gpt4 key购买 nike

来自 the exactly-once KIP ,关于使用 InitPidRequest 重启应用程序时的生产者幂等性:

2.1 When an TransactionalId is specified If the transactional.id configuration is set, this TransactionalId passed along with the InitPidRequest, and the mapping to the corresponding PID is logged in the transaction log in step 2a. This enables us to return the same PID for the TransactionalId to future instances of the producer, and hence enables recovering or aborting previously incomplete transactions.

In addition to returning the PID, the InitPidRequest performs the following tasks:

  1. Bumps up the epoch of the PID, so that the any previous zombie instance of the producer is fenced off and cannot move forward with its transaction.

  2. Recovers (rolls forward or rolls back) any transaction left incomplete by the previous instance of the producer. The handling of the InitPidRequest is synchronous. Once it returns, the producer can send data and start new transactions.

当生产者失败并再次启动并执行InitPidRequest时,最后一个事务是“前滚”(我猜这意味着提交)还是“回滚”的情况是什么?这是如何控制的?

最佳答案

使 Kafka 能够实现这一点的关键组件是事务协调器。这是作为您提到的 KIP 的一部分引入的。事务协调器由代理构建,作为初始化过程的一部分,并在内存中维护以下信息:

  1. TransactionalId 到分配的 PID、当前纪元号(Unix 时间戳)和事务超时值的映射
  2. PIDPID 指示的生产者当前正在进行的事务状态、参与者主题分区和上次更新此状态的时间的映射

现在,回答您关于前滚或后退事务的问题:

当生产者失败并重新启动时,如果生产者带有非空的 TransactionalId(作为配置参数提供),它会向事务协调器发送一个新的 InitPidRequest由生产者申请)。

事务协调器收到此请求后会检查在内存映射中是否已经存在具有提供的 TransactionalId 的条目(上面的第 1 点)。如果存在映射,它将在第二个内存映射(上面的第 2 点)中查找 PID,以检查是否有针对该 PID 的任何正在进行的事务:

  • 如果有一个正在进行的事务处于开始状态,即 BEGIN,那么事务将被中止(注意:这是回滚版本)
  • 如果有一个正在进行的事务已经开始并且处于 PREPARE_ABORTPREPARE_COMMIT 中,那么事务协调器将等待事务完成COMPLETE_ABORT(回滚 版本)或COMPLETE_COMMIT(>前滚 版本)。

在此之后,事务协调器以最新的 PIDTransactionalId 的纪元时间戳作为响应,然后生产者可以开始发送新事务。

我尽量将解释保持在最低限度,但如果您对更多细节感兴趣,那么这里是 detailed design document供大家引用。

希望对您有所帮助!

关于apache-kafka - kafka怎么知道 "roll forward or roll back"是否是一笔交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56156749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com