Producer.send回调提供了一个消息对象。 message.offset()
经常在一个似乎是错误的地方返回0。
这是使用: confluent-kafka python库版本0.11.0 librdkafka:稳定0.11.0(瓶装),HEAD。通过Mac OS Homebrew安装
以下简单的测试程序:
import confluent_kafka
import timeit
def delivery_callback(error, message):
print("delivery_callback. error={}. message={}".format(error, message))
print("message.topic={}".format(message.topic()))
print("message.timestamp={}".format(message.timestamp()))
print("message.key={}".format(message.key()))
print("message.value={}".format(message.value()))
print("message.partition={}".format(message.partition()))
print("message.offset={}".format(message.offset()))
def produce_string_messages(kafka_producer, topic_name, num_messages):
start_time = timeit.default_timer()
for i in range(num_messages):
kafka_producer.produce(topic_name, value="cf-k test. v{}".format(i), on_delivery=delivery_callback)
elapsed = timeit.default_timer() - start_time
print("completed producing messages. They are queued for delivery. elapsed={}. elapsed/msg={}".format(elapsed, elapsed / num_messages))
if __name__ == "__main__":
print("starting")
conf = {
'bootstrap.servers': "kafka-broker-1:9092"
}
kafka_producer = confluent_kafka.Producer(conf)
print("opened KafkaProducer")
produce_string_messages(kafka_producer, "my-string-topic", 3)
print("flushing...")
kafka_producer.flush()
print("exiting")
产生
starting
opened KafkaProducer
completed producing messages. They are queued for delivery. elapsed=0.000994920730591. elapsed/msg=0.00033164024353
flushing...
delivery_callback. error=None. message=<cimpl.Message object at 0x10f986ec0>
message.topic=my-string-topic
message.timestamp=(1, 1508451238822L)
message.key=None
message.value=cf-k test. v0
message.partition=0
message.offset=0
delivery_callback. error=None. message=<cimpl.Message object at 0x10f986ec0>
message.topic=my-string-topic
message.timestamp=(1, 1508451238822L)
message.key=None
message.value=cf-k test. v1
message.partition=0
message.offset=0
delivery_callback. error=None. message=<cimpl.Message object at 0x10f986ec0>
message.topic=my-string-topic
message.timestamp=(1, 1508451238822L)
message.key=None
message.value=cf-k test. v2
message.partition=0
message.offset=24
exiting
请注意,message.offset()
对于前两个消息为零,对于第三个消息为非零。如果我再次运行此测试程序发送三条消息,则第三个message.offset
递增3.这看起来只是message.offset()
经常错误地返回0的错误。
答案 0 :(得分:2)
对于性能[1],交付报告仅为生产的批次中的最后一条消息提供有效的偏移量。通过将produce.offset.report
主题级配置属性设置为true,可以更改此选项以便为批处理中的所有消息提供正确的偏移量,如下所示:
p = confluent_kafka.Producer({'bootstrap.servers': ...,
'default.topic.config': { 'produce.offset.report': True } })
我们将在未来的Python客户端版本中将默认值更改为True。
[1]:它避免了对批处理中消息的线性扫描,但性能影响在Python领域中微不足道且无关紧要,因此无需担心。