【问题标题】:confluent-python kafka producer send callback message.offset() returns 0confluent-python kafka 生产者发送回调 message.offset() 返回 0
【发布时间】:2018-04-01 01:46:29
【问题描述】:

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。

【问题讨论】:

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


    【解决方案1】:

    出于性能[1] 的原因,交付报告仅提供生产批次中最后一条消息的有效偏移量。这可以通过将produce.offset.report 主题级配置属性设置为 true 来更改为批处理中的所有消息提供适当的偏移量,如下所示:

    p = confluent_kafka.Producer({'bootstrap.servers': ..., 
                                  'default.topic.config': { 'produce.offset.report': True } })
    

    我们将在 Python 客户端的未来版本中将默认值更改为 True。

    [1]:它避免了对批处理中的消息进行线性扫描,但性能影响微乎其微,在 Python 领域无关紧要,因此无需担心。

    【讨论】:

    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 2018-04-19
    • 2023-03-08
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多