英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
Kafka 事务
Kafka 事务让写入多个分区的记录和已消费的偏移量一起变得可见,或者全都不可见。
以文字阅读本图
- 开始 在事务生产者上 → 生产 记录到任意分区
- 生产 记录到任意分区 → 发送已消费的偏移量 连同组的元数据
- 发送已消费的偏移量 连同组的元数据 → 提交 事务
- 提交 事务 → read_committed 读取者 看到这些记录, 偏移量算作已提交: 写入标记
- 发送已消费的偏移量 连同组的元数据 → 中止: 记录被丢弃, 偏移量不动, 输入被 再读一遍: 出错时
- 一个事务 id 属于一个存活的生产者: 再次初始化它会隔离先前那个
事务生产者以它的 transactional.id 命名。它一次运行一个事务。事务中生产的记录会立即落入日志,提交时写入的标记使它们变得可见。
处于 read_committed 隔离级别(librdkafka 的默认值)的读取者,只在提交之后才看到事务的记录,中止之后则永远看不到。处于 read_uncommitted 的读取者在记录写入时就能看到它们。
已消费的偏移量可以加入事务。这样,输入的位置恰好在输出变得可见时移动,这就是 KIP-447 的消费-转换-生产模式。中止会让偏移量留在原处,于是输入被再读一遍,进入新的事务。
打开时间超过 transaction.timeout.ms(一分钟)的事务会被协调者中止。用一个已在使用的 id 启动的生产者会隔离(fence)先前的那个:先前那个生产者的下一次调用会失败。