我有一个用例,我需要 100% 的可靠性、幂等性(无重复消息)以及我的 Kafka 分区中的顺序保留。我正在尝试使用事务 API 来设置概念证明来实现这一点。有一个名为“isolation.level”的设置,我很难理解。
在这篇文章中,他们讨论了这两个选项之间的区别。
Kafka 消费者现在有两个新的隔离级别:
read_committed:读取不属于事务的消息和事务提交后的消息。Read_committed 消费者使用分区的结束偏移量,而不是客户端缓冲。该偏移量是属于打开事务的分区中的第一条消息。它也被称为“最后稳定偏移”(LSO)。read_committed 消费者只会读取到 LSO 并过滤掉任何已中止的事务消息。
read_uncommitted:按偏移顺序读取所有消息,无需等待事务提交。此选项类似于 Kafka 消费者的当前语义。
这里的性能含义是显而易见的,但老实说,我正在努力阅读字里行间并理解每个选择的功能含义/风险。似乎read_committed“更安全”,但我想了解原因。
首先,isolation.level如果消费者消费的主题包含使用事务性生产者编写的记录,则该设置仅对消费者产生影响。
如果是这样,如果它设置为read_uncommitted,消费者将简单地读取包括中止交易在内的所有内容。这是默认设置。
当设置为 时read_committed,消费者将只能从已提交的事务中读取记录(除了不属于事务的记录)。这也意味着为了保持排序,如果交易正在进行中,消费者将无法消费属于该交易的记录。基本上,代理只允许消费者读取最后一个稳定偏移量 (LSO)。当事务提交(或中止)时,代理将更新 LSO,消费者将收到新记录。
如果您不能容忍中止事务的重复或记录,那么您应该使用read_committed. 正如您所暗示的那样,这会在消费中产生一个小的延迟,因为只有在提交事务后记录才可见。影响主要取决于您的交易规模,即您提交的频率。
| 归档时间: |
|
| 查看次数: |
8924 次 |
| 最近记录: |