消费者将如何阅读已提交的消息?

时间:2020-02-10 08:41:24

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

据我对Transactions in Apache Kafka的了解, read_committed 使用者将不会返回正在进行的交易中的消息。因此,我想,消费者将可以选择将偏移量提交到那些正在进行的交易消息之后(例如,读取非交易消息),或者可以选择不进行进一步的交易,直到遇到/终止交易为止。我只是想(允许Kafka)跳过那些未完成的交易记录,但是考虑到其偏移量可能已经很远了,那么当提交时,消费者如何读取它们?

更新

请考虑该主题可能包含来自非事务性生产者和事务性生产者的记录(又称消息)的混合。例如,考虑以下主题中的分区

non-transact-Xmsg,from-transact-producer1-msg,from-transact-producer2-msg,non-transact-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 可能是已提交的。

2 个答案:

答案 0 :(得分:2)

摘自有关isolation.level的文档:

消息将始终以偏移顺序返回。因此,在read_committed模式下,consumer.poll()仅返回直到last stable offset (LSO)的消息,该消息比第一个未清事务的偏移量小。 特别是,属于正在进行的交易的消息之后出现的所有消息将被保留,直到相关交易完成为止。结果,read_committed消费者将无法读取高水位标记在进行飞行交易时。

答案 1 :(得分:0)

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