如何使用Pykafka从主题中获取最新消息?

时间:2017-06-26 17:56:48

标签: python apache-kafka kafka-consumer-api pykafka

我正在使用pykafka

不断向主题发送消息
producer.produce('test')

我想收到最新消息。我在pykafka Github页面上找到了一个解决方案:

client = KafkaClient(hosts="xxxxxxx")
topic = client.topics['mytopic']
consumer = topic.get_simple_consumer(
    auto_offset_reset=OffsetType.LATEST,
    reset_offset_on_start=True)
LAST_N_MESSAGES = 2
offsets = [(p, op.next_offset - LAST_N_MESSAGES) for p, op in consumer._partitions.iteritems()]
consumer.reset_offsets(offsets)
consumer.consume()

但是,我真的不明白这里发生了什么,如果已经有至少两条消息,它只会收到最新消息。

是否有更强大的解决方案?

1 个答案:

答案 0 :(得分:3)

确切地说明你最近的消息"是非常重要的。在具有多个分区的Kafka主题中,实际上不可能在不检查消息内容的情况下知道每个分区上的哪个最新消息是全局最新消息。定义何时想要获取最新消息也很重要 - 您现在想要它们一次吗?是否要开始使用最新消息,然后继续使用消息,因为它们已添加到主题中?您是否希望定期仅获取最新的N条消息?

上面包含的配方(我为PyKafka文档编写的基础)为您选择N提供了每个分区的最后N条消息。如果您只想获取最后一条消息,则只需设置{{ 1}}到1.基本上,配方检查每个分区消耗的最新偏移量,然后在此之前将消费者的偏移量精确地重置为LAST_N_MESSAGES。当您从这一点开始消费时,您只获得分区的最后N条消息。

所有这些都说,如果你只是想从主题的最后开始消费,你可以使用它:

LAST_N_MESSAGES

并开始正常消费。