apache-kafka - 消费者将如何阅读已提交的消息?
问题描述
因此,据我从Apache Kafka中的 Transactions 了解,read_committed消费者不会返回作为正在进行的事务的一部分的消息。所以,我猜,消费者可以选择在那些正在进行的事务消息之后提交它的偏移量(例如,读取非事务消息),或者在遇到的事务被提交/中止之前不做进一步的处理。我只是假设(Kafka)允许它跳过那些待处理的事务记录,但是考虑到它的偏移量可能已经很远,消费者在提交时将如何读取它们?
更新
考虑到该主题可能包含来自非事务性生产者和事务性生产者的记录(也称为消息)。例如,考虑一个主题的这个分区:
非交易-Xmsg、来自-交易-生产者1-msg、来自-交易-生产者2-msg、非交易-Ymsg
如果消费者遇到from-transact-producer1-msg他会跳过消息然后读取non-transact-Ymsg还是会在尚未提交的 from-transact-producer1-msg之前挂起,这样做不会读取non -transact-Ymsg ?
还要考虑可能有许多事务性生产者和许多from-transact-producer1-msg 的等价物,有些承诺有些没有。因此,当消费者到达non-transact-Xmsg时, from-transact-producer2-msg可能是已提交的。
解决方案
来自关于的文档isolation.level
:
消息将始终按偏移顺序返回。因此,在
read_committed
mode 下,consumer.poll()
将只返回直到 的消息last stable offset (LSO)
,它小于第一个打开事务的偏移量。特别是在属于正在进行的交易的消息之后出现的任何消息都将被保留,直到相关交易完成。结果,read_committed
当存在飞行交易时,消费者将无法读取到高水位线。
推荐阅读
- javascript - 从 nodejs 的 mongodb 查询返回值
- android - 由于 android.support.v4.content.FileProvider.parsePathStrategy Android 崩溃
- java - 安卓工作室的jdk8 windows 10
- iis - PWA 清单加载,但我无法获得安装提示
- alluxio - 如何在 Alluxio 2.0 java api 中设置主地址和 19998 端口?
- html - 根据 no 更改 html 5 表中的列间距和字体大小。列的
- msbuild - Azure DevOps 中的配置转换
- android - Android Studio Profiler 中垃圾收集的持续时间为 0
- python - PyQt4 - 如何从 QListWidgetItem 中读取 QLineEdit 文本
- database - Laravel:使用内部连接从数据库中获取多条记录