Kafka Consumer - 具有更高优先级的主题

时间:2017-07-17 08:43:45

标签: apache-kafka kafka-consumer-api

我正在使用Kafka Consumer阅读几个主题,我需要其中一个具有更高的优先级。处理需要花费大量时间,并且(低优先级)主题中总是有很多消息,但我需要尽快处理来自其他消息的消息。

Does Kafka support priority for topic or message?类似的问题,但这个问题是使用旧API。

在新API(0.10.1.1)中,有方法

KafkaConsumer::pause(Collection)
KafkaConsumer::resume(Collection)

但我不清楚如何有效地检测到高优先级主题中有新消息,并且有必要暂停其他主题的消费。

任何想法/例子?

2 个答案:

答案 0 :(得分:3)

最后,我解决了这个问题,正如dawsaw建议的那样 - 在处理循环中,我存储了我读取的所有主题/分区:

  • beginningOffsets
  • endOffsets
  • 已提交 - 我无法使用职位,因为我订阅了主题,而不是分区。

每当(endOffset - commited) > 0针对任何优先主题时,我都会针对非优先级主题调用consumer.pause(),并在(endOffset - commited) == 0之后针对所有优先级主题再次恢复这些主题。

答案 1 :(得分:0)

我猜你可以混合使用position()和committed()方法。 position()方法获取将被提取的下一条记录的偏移量,并且committed()方法获取给定分区的最后一个提交的偏移量(如文档中所述)。 在轮询较低优先级之前,您可以检查position()和committed()以获得更高的优先级。如果position()高于committed(),则可以暂停()较低优先级,并在较高优先级()上暂停poll(),然后恢复较低优先级。