控制Kafka消费者

时间:2017-04-05 05:21:36

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

实现是在Python中。使用confluent_kafka。

我有一个消费者对象来从kafka主题中轮询消息。消息用于其他大对象的进一步处理,由于大小,我无法在每次消息处理后备份对象。

我定期转储对象,然后手动提交使用者。以下是我实施的示例代码。

from confluent_kafka import Consumer, KafkaError, TopicPartition

c = Consumer({
    'bootstrap.servers': 'myserver',
    'group.id': 'mygroup',
    'default.topic.config': {'auto.offset.reset': 'smallest'},
    'enable.auto.commit': "false"
})
c.subscribe(['mytopic'])

offsets = {} 

for i in range(10):
    msg = c.poll()

    if msg.error():
        continue

    par = msg.partition()
    off = msg.offset() 
    offsets[p] = off 

c.commit(async=False) 

print(offsets) 

当我第二次运行此代码时,我希望消息偏移(如果来自同一分区)应该是下一个,即打印后的偏移量+1。

但补偿提高了很多。几百多。

我还尝试按如下方式手动分配位置:

lst_part = []

for par, off in offsets.items():
    lst_part.append(TopicPartition('mytopic', par, off))

c.assign(lst_part)

# then start polling messages

新轮询的消息不是指定的偏移量+ 1.

1 个答案:

答案 0 :(得分:1)

c.commit(async=False)将通过poll()调用提交已从客户端向应用程序返回消息的所有已消耗分区。

如果您想要更精细地控制提交哪些偏移,您可以将显式[TopicPartition(..)]列表传递给commit()(确保提交last_message_offset + 1)或禁用auto.offset.store和明确致电store_offsets(),查看您希望为将来的commit()电话存储的消息/偏移量。

请注意store_offsets()仅在master上可用,并且尚未在confluent-kafka-python客户端的已发布版本中提供,但很快就会出现。