【问题标题】:How a consumer will read committed messages?消费者将如何阅读已提交的消息?
【发布时间】:2020-02-11 06:38:45
【问题描述】:

因此,据我从Transactions in Apache Kafka 了解到,read_committed 消费者不会返回作为正在进行的事务的一部分的消息。所以,我猜,消费者可以选择在那些正在进行的事务消息之后提交它的偏移量(例如,读取非事务消息),或者在遇到的事务被提交/中止之前不做进一步的处理。我只是假设(Kafka)允许它跳过那些待处理的事务记录,但是考虑到它的偏移量可能已经很远,消费者在提交时将如何读取它们?

更新

考虑到该主题可能包含来自非事务性生产者和事务性生产者的记录(也称为消息)。例如,考虑一个主题的分区

non-transact-Xmsg, from-transact-producer1-msg, from-transact-producer2-msg, non-transact-Ymsg

如果consumer遇到from-transact-producer1-msg他会跳过消息然后阅读non-transact-Ymsg还是会只需在尚未提交的 from-transact-producer1-msg 之前挂起,这样做就不会读取 non-transact-Ymsg

还考虑到可能有许多事务生产者和许多 from-transact-producer1-msg 的等价物,有些承诺有些没有。因此,from-transact-producer2-msg 可能是消费者到达 non-transact-Xmsg 时的承诺。

【问题讨论】:

  • 在同一个 Confluent 博客中声明 "...消费者不需要 [sic] 任何缓冲来等待交易完成。相反,代理不需要允许它提前到包括未结交易的抵消。"
  • 这部分让我感到困惑,因为它并没有说不允许消费者跳过待处理的交易记录来阅读例如非交易记录。但是当待处理的事务记录被提交时会发生什么呢?它们是否会因为在待处理时被跳过而保持未阅读状态?消费者会以某种方式自动返回吗?这些都没有意义。

标签: apache-kafka kafka-consumer-api kafka-transactions-api


【解决方案1】:

来自关于isolation.level的文档:

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

【讨论】:

  • 请参阅更新,它强调了在一个主题的分区中混合基于事务或非基于事务的记录(又名消息)的可能性,以及许多事务生产者的记录也混合在一起.
【解决方案2】:

您的要求不是 100% 明确的,但如果我做对了,您希望能够重新处理一些已使用的消息,由于某种原因,您在第一次使用它们时无法成功处理这些消息。而且-您不想被这些消息“卡住”,您更愿意继续前进并稍后处理这些消息。 在这种情况下,最好的选择可能是将它们写入一个不同的队列,并让另一个消费者阅读那些“失败”的消息并尽可能多地重试。

【讨论】:

  • 谢谢,但问题是关于 kafka 交易和消费者在继续推进的同时过滤未提交的交易。在某些时候,消费者也应该返回已提交的交易,但如何?他已经提前(它的 kafka 偏移量)超过了现在提交的事务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2020-08-24
  • 2017-03-19
相关资源
最近更新 更多