首页 > 解决方案 > 消费者将如何阅读已提交的消息?

问题描述

因此,据我从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可能是已提交的。

标签: apache-kafkakafka-consumer-apikafka-transactions-api

解决方案


来自关于的文档isolation.level

消息将始终按偏移顺序返回。因此,在read_committedmode 下,consumer.poll()将只返回直到 的消息last stable offset (LSO),它小于第一个打开事务的偏移量。特别是在属于正在进行的交易的消息之后出现的任何消息都将被保留,直到相关交易完成。结果,read_committed当存在飞行交易时,消费者将无法读取到高水位线。


推荐阅读