【问题标题】:Kafka: isolation level implicationsKafka:隔离级别含义
【发布时间】:2019-05-08 19:42:43
【问题描述】:

我有一个用例,我需要 100% 的可靠性、幂等性(无重复消息)以及我的 Kafka 分区中的订单保留。我正在尝试使用事务 API 来建立概念证明来实现这一点。我很难理解一个名为“isolation.level”的设置。

在这个article中,他们谈到了两个选项的区别

Kafka 消费者现在有两个新的隔离级别:

read_committed:读取不属于 事务,即在事务提交之后。 Read_committed 消费者使用分区的结束偏移量,而不是 客户端缓冲。这个偏移量是第一个消息 属于一个开放事务的分区。它也被称为“最后 稳定偏移”(LSO)。一个 read_committed 消费者只会读到 LSO 并过滤掉任何已被 中止。

read_uncommitted:按偏移顺序读取所有消息,没有 等待事务提交。此选项类似于 Kafka 消费者的当前语义。

这里的性能影响是显而易见的,但老实说,我很难在字里行间阅读并理解每个选择的功能影响/风险。 read_committed 似乎“更安全”,但我想了解原因。

【问题讨论】:

  • 已编辑以明确我正在使用事务性 api。

标签: apache-kafka


【解决方案1】:

首先,isolation.level 设置仅在其消费的主题包含使用事务性生产者编写的记录时才会对消费者产生影响。

如果是这样,如果它设置为read_uncommitted,消费者将简单地读取包括中止事务在内的所有内容。这是默认设置。

当设置为read_committed 时,消费者将只能从已提交的事务中读取记录(除了不属于事务的记录之外)。这也意味着为了保持排序,如果交易正在进行中,消费者将无法使用属于该交易的记录。基本上,代理将只允许消费者读取最后一个稳定偏移量 (LSO)。当事务提交(或中止)时,代理将更新 LSO,消费者将收到新记录。

如果您不能容忍来自中止事务的重复或记录,那么您应该使用read_committed。正如您所暗示的,这会在消费方面产生一点延迟,因为只有在提交事务后才能看到记录。影响主要取决于您的交易规模,即您提交的频率。

【讨论】:

  • 如果您说在一个事务中发布一百万条消息,但同时还有来自用户的正常非事务性消息,那么批量发送发生时会有很大的延迟时间,对吗?从我读到的内容来看,kafka 集群默认情况下不会中止您的事务 15 分钟(似乎它真的可以让该主题的所有消费者长时间停滞不前)。有什么想法吗?
【解决方案2】:

如果您没有在生产者中使用事务,则隔离级别无关紧要。如果是,那么如果您希望消费者尊重交易性质,则必须使用read_committed。以下是一些额外的参考资料:

https://www.confluent.io/blog/transactions-apache-kafka/ https://docs.google.com/document/d/11Jqy_GjUGtdXJK94XGsEIK7CP1SnQGdp2eF0wSw9ra8/edit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 2013-01-25
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多