繁体   English   中英

在 Python 获取 Confluent Kafka 主题的最新消息

[英]Get Latest Message for a Confluent Kafka Topic in Python

到目前为止,这是我尝试过的:

from confluent_kafka import Consumer

c = Consumer({... several security/server settings skipped...
              'auto.offset.reset': 'beginning',
              'group.id': 'my-group'})

c.subscribe(['my.topic'])
msg = poll(30.0)  # msg is of None type.

msg几乎总是以None结束。 我认为问题可能是'my-group'已经使用了'my.topic'所有消息......但我不关心消息是否已经被使用 - 我仍然需要最新消息。 具体来说,我需要最新消息的时间戳。

我尝试了更多,从这里看起来主题中可能有 25 条消息,但我不知道如何获取它们:

a = c.assignment()
print(a)  # Outputs [TopicPartition{topic=my.topic,partition=0,offset=-1001,error=None}]
offsets = c.get_watermark_offsets(a[0])
print(offsets)  # Outputs: (25, 25)

如果没有消息是因为该主题根本没有写入任何内容,我该如何确定? 如果是这样,我如何确定该主题存在了多长时间? 我正在寻找一个脚本,自动删除过去 X 天内未写入的任何主题(最初 14 个 - 可能会随着时间的推移进行调整。)

我遇到了同样的问题,没有这方面的例子。 在我的情况下,有一个分区,我需要阅读最后一条消息,以了解该消息中的一些信息以设置我拥有的消费者/生产者组件。

逻辑是启动Consumer ,订阅主题,轮询消息 -> 这会触发on_assign ,通过将修改后的分区分配回去,发生倒带。 on_assign完成后,对msg的轮询继续并从主题中读取最后一条消息。

settings = {
    "bootstrap.servers": "my.kafka.server",
    "group.id": "my-work-group",
    "client.id": "my-work-client-1",
    "enable.auto.commit": False,
    "session.timeout.ms": 6000,
    "default.topic.config": {"auto.offset.reset": "largest"},
}
consumer = Consumer(settings)

def on_assign(a_consumer, partitions):
    # get offset tuple from the first partition
    last_offset = a_consumer.get_watermark_offsets(partitions[0])
    # position [1] being the last index
    partitions[0].offset = last_offset[1] - 1
    consumer.assign(partitions)

consumer.subscribe(["test-topic"], on_assign=on_assign)

msg = consumer.poll(6.0)

现在msg里面有最后一条消息。

如果有人仍然需要多个分区的示例; 我就是这样做的:

from confluent_kafka import OFFSET_END, Consumer

settings = {
    'bootstrap.servers': "my.kafka.server",
    'group.id': "my-work-group",
    'auto.offset.reset': "latest"
}

def on_assign(consumer, partitions):
    for partition in partitions:
        partition.offset = OFFSET_END
    consumer.assign(partitions)


consumer = Consumer(settings)

consumer.subscribe(["test-topic"], on_assign=on_assign)

msg = consumer.poll(1.0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM