在WSL2 Ubuntu中使用Python的卡夫卡消费者/生产者
这是我的后续问题 根据线程的建议,我的Python代码无法工作的可能原因是因为我要连接到WSL2中的远程服务器。WSL2 Ubuntu可能存在未知问题 因此,我用以下两种在WLS2 Ubuntu内部进行本地通信的方法(即通过在WSL2 Ubuntu中使用Python的卡夫卡消费者/生产者,python,apache-kafka,wsl-2,Python,Apache Kafka,Wsl 2,这是我的后续问题 根据线程的建议,我的Python代码无法工作的可能原因是因为我要连接到WSL2中的远程服务器。WSL2 Ubuntu可能存在未知问题 因此,我用以下两种在WLS2 Ubuntu内部进行本地通信的方法(即通过localhost:9092)来验证这一假设: 请注意,对于以下两种方法,我已经在一个终端(T1)中运行了zookeeper,其中包括: 方法1:通过以下命令(取自)在控制台中与生产者/消费者通信 步骤1:创建主题TutorialTopic(在终端T2) 步骤2:在终端T3
localhost:9092
)来验证这一假设:
请注意,对于以下两种方法,我已经在一个终端(T1
)中运行了zookeeper,其中包括:
方法1:通过以下命令(取自)在控制台中与生产者/消费者通信
步骤1:创建主题TutorialTopic
(在终端T2
)
步骤2:在终端T3
echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic
步骤3:在另一个终端T4
~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TutorialTopic --from-beginning
结果:我在T4号终端看到一条消息你好,世界
方法2:通过两个Python模块进行通信,consumer.py
和producer.py
,如下所示:
步骤1:在终端T5
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic sample
步骤2:在终端T6
producer.py
步骤3:在终端T7
consumer.py
结果:T7上不显示任何内容。除非执行Ctrl+C
,否则Python控制台将无法运行。不会产生其他错误或消息。与where-I-getNo-Broker
错误不同
然而,在这种方法2中,如果我通过如下所示的T6
中的命令生成消息,我会意外地在消费者终端T7
中接收到它:
echo "Hello" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic sample
我的最终目标是使用Python应用程序从远程服务器获取消息,并使用WSL2 Ubuntu。这个实验似乎暗示WSL2不是问题所在。如果有人能告诉我这里发生了什么
通过命令生成消息。。。我意外地在T7消费终端中收到了它
这并不奇怪,因为在启动消费者循环后,您没有在Python producer应用程序中调用producer.flush()
或producer.close()
控制台生产者通过在将来调用get()阻塞每条记录,从而有效地刷新其缓冲区
或者,如果您希望查看以前发送的记录,那么您将在Python使用者中缺少从一开始的
的匹配选项
最终,在同一网络适配器/子网内测试本地客户机/服务器无助于解决外部网络连接问题我明白了。在这个线程中,我试图理解为什么Python消费者在本地没有从Python生产者那里收到任何东西。这里有两个问题:为什么Python中的发送和接收不起作用;以及为什么使用Python从远程服务器接收不起作用。
producer.send()
在批量发送足够的记录后才能起作用。消息不会立即发送。您可以刷新以强制发送批。关于远程服务器的事情,我不知道know@Thanks谢谢你的解释。根据上面的回答,我让Python生产者和消费者开始工作(通过发送100多条消息和producer.flush()
并设置auto\u offset\u reset='minimate')。我会关闭这个。
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers='localhost:9092')
producer.send('sample', value='Hello, World!')
consumer.py
from kafka import KafkaConsumer
consumer = KafkaConsumer('sample', bootstrap_servers=['localhost: 9092'])
for message in consumer:
print (message.value)
echo "Hello" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic sample