我有一个用例,在我的Kafka分区中,我需要100%的可靠性,幂等性(无重复消息)以及订单保留。我正在尝试使用事务性API来建立概念验证来实现这一目标。我正在努力理解一个名为“ isolation.level”的设置。
在此article中,他们讨论了两个选项之间的区别
Kafka使用者中现在有两个新的隔离级别:
read_committed:读取两种消息,它们都不属于 事务,即在事务提交之后。 Read_committed使用者使用分区的结束偏移量,而不是 客户端缓冲。此偏移量是 属于公开交易的分区。也称为“最后 稳定偏移”(LSO)。一个read_committed的消费者只会读到 LSO并过滤掉已经 流产了。
read_uncommitted:以偏移顺序读取所有消息,而没有 等待事务提交。此选项类似于 Kafka使用者的当前语义。
在这里,它们对性能的影响是显而易见的,但是老实说,我一直在努力阅读本书,并理解每种选择的功能含义/风险。似乎read_committed
较“安全”,但我想了解原因。
答案 0 :(得分:2)
首先,isolation.level
设置仅在其使用的主题包含使用事务性生产者编写的记录的情况下才对消费者有影响。
如果是这样,如果将其设置为read_uncommitted
,则使用者将只读取包括中止的事务在内的所有内容。这是默认设置。
设置为read_committed
时,使用者将只能从已提交的事务中读取记录(除了不属于事务一部分的记录)。这也意味着,为了保持订单顺序,如果正在进行交易,则消费者将无法使用该交易中的记录。基本上,经纪人将只允许消费者读取最后稳定偏移量(LSO)。提交(或中止)交易后,代理将更新LSO,而消费者将收到新记录。
如果您不容许中止的交易重复或记录,则应使用read_committed
。正如您所暗示的那样,这会导致消耗量稍有延迟,因为只有在提交事务后才可见记录。影响主要取决于交易的规模,即您的提交频率。
答案 1 :(得分:1)
如果您不在生产者中使用事务,则隔离级别无关紧要。如果是,那么如果您希望消费者尊重交易性质,则必须使用read_committed
。以下是一些其他参考:
https://www.confluent.io/blog/transactions-apache-kafka/ https://docs.google.com/document/d/11Jqy_GjUGtdXJK94XGsEIK7CP1SnQGdp2eF0wSw9ra8/edit