我读了很多Kafka关于交易的文献,但有一件事我仍然不清楚。
当我有一个生产者,为我的主题生产事务性和非事务性消息时,我的消费者(具有属性read_committed)仍然会以正确的顺序读取吗?
1分区示例:
1.生产者A在一个事务中产生3条消息-〉所以3条新的未提交消息在主题上
1.生产者A产生3个非事务性消息
1.生产者A从1提交事务。
我的消费者是否正在等待来自% 1.的事务提交或中止以遵循正确的顺序,然后读取来自% 2.的消息?
我唯一发现的是:“Kafka保证消费者最终只会传递非事务性消息或已提交的事务性消息。它将保留打开事务的消息,并过滤掉已中止事务的消息。”但我想这并没有回答我的问题。
已阅读Spring Kafka文档
1条答案
按热度按时间s8vozzvw1#
消费者的行为取决于其
isolation.level
配置。isolation.level=read_uncommitted
(默认),消费者将在生成3个事务性消息后立即读取它们,然后读取3个非事务性消息。isolation.level=read_committed
,消费者在提交包含前3条消息的事务之前不会读取任何消息。一旦提交,它将读取3条事务性消息,然后读取3条非事务性消息。如果事务被中止,它将跳过3条事务性消息,只读取3条非事务性消息。使用
read_committed
时,使用者在到达不属于已提交(或已中止)事务的记录时阻塞,并等待该事务完成。在不手动显式更改使用者位置的情况下,记录始终按顺序使用。