Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WSL2 Ubuntu中使用Python的卡夫卡消费者/生产者_Python_Apache Kafka_Wsl 2 - Fatal编程技术网

在WSL2 Ubuntu中使用Python的卡夫卡消费者/生产者

在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

这是我的后续问题

根据线程的建议,我的Python代码无法工作的可能原因是因为我要连接到WSL2中的远程服务器。WSL2 Ubuntu可能存在未知问题

因此,我用以下两种在WLS2 Ubuntu内部进行本地通信的方法(即通过
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-get
No-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