Server 端事务状态管理
TransactionCoordinator 会维护相应的事务的状态信息(也就是 TxnStatus),对于一个事务,总共有以下几种状态:
状态 状态码 说明
Empty 0 Transaction has not existed yet
Ongoing 1 Transaction has started and ongoing
PrepareCommit 2 Group is preparing to commit
PrepareAbort 3 Group is preparing to abort
CompleteCommit 4 Group has completed commit
CompleteAbort 5 Group has completed abort
Dead 6 TransactionalId has expired and is about to be removed from the transaction cache
PrepareEpochFence 7 We are in the middle of bumping the epoch and fencing out older producers
其相应有效的状态转移图如下:
正常情况下,对于一个事务而言,其状态状态流程应该是 Empty –> Ongoing –> PrepareCommit –> CompleteCommit –> Empty 或者是 Empty –> Ongoing –> PrepareAbort –> CompleteAbort –> Empty。
Client 端事务状态管理
Client 的事务状态信息主要记录本地事务的状态,当然跟其他的系统类似,本地的状态信息与 Server 端的状态信息并不完全一致(状态的设置,就像 GroupCoodinator 会维护一个 Group 的状态,每个 Consumer 也会维护本地的 Consumer 对象的状态一样)。Client 端的事务状态信息主要用于 Client 端的事务状态处理,其主要有以下几种:
UNINITIALIZED:Transactional Producer 初始化时的状态,此时还没有事务处理;
INITIALIZING:Transactional Producer 调用 initTransactions() 方法初始化事务相关的内容,比如发送 InitProducerIdRequest 请求;
READY:对于新建的事务,Transactional Producer 收到来自 TransactionCoordinator 的 InitProducerIdResponse 后,其状态会置为 READY(对于已有的事务而言,是当前事务完成后 Client 的状态会转移为 READY);
IN_TRANSACTION:Transactional Producer 调用 beginTransaction() 方法,开始一个事务,标志着一个事务开始初始化;
COMMITTING_TRANSACTION:Transactional Producer 调用 commitTransaction() 方法时,会先更新本地的状态信息;
ABORTING_TRANSACTION:Transactional Producer 调用 abortTransaction() 方法时,会先更新本地的状态信息;
ABORTABLE_ERROR:在一个事务操作中,如果有数据发送失败,本地状态会转移到这个状态,之后再自动 abort 事务;
FATAL_ERROR:转移到这个状态之后,再进行状态转移时,会抛出异常;
Client 端状态如下图:
参考:http://matt33.com/2018/11/04/kafka-transaction/