【问题标题】:Unable to send messages to Topic in Kafka Python无法在 Kafka Python 中向主题发送消息
【发布时间】:2020-06-16 09:36:23
【问题描述】:

我有一个生产者代码,用于向 Kafka 发送消息。直到昨天我都能发送消息。从今天起,我无法发送消息。不确定其版本是否兼容问题。没有任何失败或错误消息,代码被执行,但它不发送消息。

以下是python模块版本,
kafka-python==2.0.1
Python 3.8.2

下面是我的代码,

from kafka import KafkaProducer
import logging
logging.basicConfig(level=logging.INFO)

producer = KafkaProducer(bootstrap_servers='127.0.0.1:9092')
producer.send('Jim_Topic', b'Message from PyCharm')
producer.send('Jim_Topic', key=b'message-two', value=b'This is Kafka-Python')

任何建议都会有所帮助。

我也尝试记录该行为,但不知道为什么生产者被关闭,

INFO:kafka.conn:<BrokerConnection node_id=bootstrap-0 host=127.0.0.1:9092 <connecting> [IPv4 ('127.0.0.1', 9092)]>: connecting to 127.0.0.1:9092 [('127.0.0.1', 9092) IPv4]
INFO:kafka.conn:<BrokerConnection node_id=bootstrap-0 host=127.0.0.1:9092 <connecting> [IPv4 ('127.0.0.1', 9092)]>: Connection complete.
INFO:kafka.producer.kafka:Closing the Kafka producer with 0 secs timeout.
INFO:kafka.producer.kafka:Proceeding to force close the producer since pending requests could not be completed within timeout 0.
INFO:kafka.producer.kafka:Kafka producer closed

Process finished with exit code 0

【问题讨论】:

  • 如果这是本地安装的 Kafka,您可以尝试写入单独的主题。也按原样发送字符串,不要将它们转换为二进制字符串
  • 我做到了。我能够将消息从 kafka-producer 控制台发送到 kafka-consumer 控制台。但我无法通过 python 做同样的事情
  • 不,我的意思是尝试使用相同的代码将消息发送到单独的主题
  • 我也试过了,创建了一个新主题Kafka_RND,仍然无法发送消息
  • 这是您的全部代码吗?如果没有,可以分享剩下的部分

标签: python apache-kafka kafka-python


【解决方案1】:

最后添加producer.flush() 帮助我解决了这些问题。在实际提交事务之前,任何未完成的消息都将被刷新(传递)

from kafka import KafkaProducer
import logging
logging.basicConfig(level=logging.INFO)

producer = KafkaProducer(bootstrap_servers='127.0.0.1:9092')
producer.send('Jim_Topic', b'Message from PyCharm')
producer.send('Jim_Topic', key=b'message-two', value=b'This is Kafka-Python')
producer.flush()

【讨论】:

    【解决方案2】:

    你能试试下面的代码吗?我从 kafka-python 文档中选择了它,并在我本地的 Kafka 实例上进行了尝试

    from kafka import KafkaProducer
    import json
    def on_send_success(record_metadata):
        print(record_metadata.topic)
        print(record_metadata.partition)
        print(record_metadata.offset)
    
    
    def on_send_error(excp):
        log.error('I am an errback', exc_info=excp)
    
    
    if __name__ == "__main__":
        target_topic = "Jim_Topic"
        producer = KafkaProducer(bootstrap_servers=['127.0.0.1:9092'],retries=5, key_serializer=lambda x: json.dumps(x).encode("ascii"), value_serializer=lambda x: json.dumps(x).encode("ascii"))
        messages = [{key:"message_one",value:"Message from PyCharm"},{key:"message_two",value:"This is Kafka-Python"}]
        for msg in messages:
          producer.send(target_topic,msg).add_callback(on_send_success).add_errback(on_send_error)
    
        producer.flush(timeout=10) # this forcibly sends any messages that are stuck.
        producer.close(timeout=5)
    

    【讨论】:

    • 还是一样。消息未发送
    • 我改了发送Json消息的代码,现在可以查看了吗?
    猜你喜欢
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2016-11-10
    • 2020-11-27
    • 1970-01-01
    • 2019-01-16
    • 2020-08-18
    • 2019-10-13
    相关资源
    最近更新 更多