apache-kafka - Kafka:隔离级别含义
问题描述
我有一个用例,我需要 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
. 正如您所暗示的,这会在消费方面产生一点延迟,因为只有在提交事务后才能看到记录。影响主要取决于您的交易规模,即您提交的频率。
推荐阅读
- docker - 重启 docker 服务或重启后 Docker 容器丢失文件
- ruby-on-rails - 循环遍历 Ruby 哈希并访问值
- arrays - Kotlin 数组操作
- angular - 在不使用 AngularFire 的情况下在 Angular 6 应用程序中包含 firebase 5
- python - numpy数组中的逐列点积
- visual-studio-code - 如何计算从 VSCode 扩展中发生的 LanguageServer 完成请求?
- jquery - symfony 表单中具有不同占位符的多个 select2 表单字段
- jenkins - 蓝海缺少分支/提交信息
- java - 大摇大摆地从.json文件生成Java中的Rest api
- c - 简单 C 程序的不可预测的输出