应用场景
- Producer发送的消息包含多条,组成一个事务,这些消息要么全部对Consumer可见,要么全部不可见
- 这些消息往往是往不同的分区发送,那么如何控制多分区的事务则成为了分布式事务
- 事务处理过程中,隔离级别控制着Consumer对这些消息的可见
事务原理
Transaction Coordinator
引入Coordinator,是每个broker内部模块,事务日志则写入到内部的topic中,事务日志中存储当前事务的最新状态,如如“Ongoing”,“prepare commit”和“Completed”之类的各种状态。
每个Producer配置transactional.id唯一。
流程
- Producer通过initTransactions 向Coordinator注册transactionid
- 当commit或者abort时,Coordinator开启二阶段提交协议
- Producer将数据写入目标Topic所在分区
相关配置
Producer
- enable.idempotence:开启幂等
- transaction.timeout.ms:事务超时时间
- transactional.id
Consumer
isolation.level:读未提交、读已提交
Broker
- transactional.id.timeout.ms
- max.transaction.timeout.ms
- transaction.state.log.replication.factor
- transaction.state.log.num.partitions
- transaction.state.log.min.isr
- transaction.state.log.segment.bytes