我有一个用例,我需要 Kafka 分区中的 100% 可靠性、幂等性(无重复消息)以及顺序保留。我正在尝试使用事务 API 来建立概念验证来实现这一目标。有一个名为“isolation.level”的设置,我很难理解。
In this article https://hevodata.com/blog/kafka-exactly-once/,他们谈论两种选择之间的区别
Kafka 消费者现在有两个新的隔离级别:
read_commissed:读取不属于消息一部分的两种消息
事务,即事务提交后。
Read_commited 消费者使用分区的结束偏移量,而不是
客户端缓冲。该偏移量是消息中的第一条消息
属于开放事务的分区。它也被称为“最后
稳定偏移”(LSO)。 read_commited 消费者只会读取直到
LSO 并过滤掉任何已被处理的事务消息
中止了。
read_uncommissed:按偏移顺序读取所有消息,无需
等待事务提交。该选项类似于
Kafka 消费者的当前语义。
这里的性能影响是显而易见的,但老实说,我很难理解字里行间并理解每个选择的功能影响/风险。这好像是read_committed
是“更安全”,但我想了解为什么。
首先,isolation.level
仅当消费者消费的主题包含使用事务生产者编写的记录时,该设置才会对消费者产生影响。
如果是的话,如果设置为read_uncommitted
,消费者将简单地读取所有内容,包括中止的交易。这是默认设置。
当设置为read_committed
,消费者将只能从已提交的事务中读取记录(除了不属于事务的记录之外)。这还意味着,为了保持排序,如果事务正在进行中,消费者将无法使用属于该事务的记录。基本上,代理只允许消费者读取最后稳定偏移量(LSO)。当事务提交(或中止)时,代理将更新 LSO,并且消费者将收到新记录。
如果您不能容忍来自中止事务的重复或记录,那么您应该使用read_committed
。正如您所暗示的那样,这会在消费方面造成很小的延迟,因为记录仅在提交事务后才可见。影响主要取决于事务的大小,即提交的频率。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)