以下是我的docker-compose文件:
version: "3"
services:
app:
image: app
restart: always
ports:
- "8001:8081"
depends_on:
- kafka
- zookeeper
- consumer
environment:
- KAFKA_HOST = kafka
zookeeper:
image: "wurstmeister/zookeeper:latest"
ports:
- "2181:2181"
hostname: zookeeper
kafka:
image: "wurstmeister/kafka:2.12-2.2.0"
ports:
- "9092:9092"
hostname: kafka
links:
- zookeeper:zookeeper
environment:
KAFKA_CREATE_TOPICS: "Topic01:2:2" #TOPIC:PARTITON:REPLICATION
KAFKA_ZOOKEEPER_CONNECTION_TIMEOUT_MS: "60000"
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
KAFKA_LISTENERS: 'PLAINTEXT://:9092'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka:9092'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
consumer:
image: consumer:latest
build:
context: ./consumer
ports:
- "8283:8283"
文本流是使用app
图像的容器生成的,并且能够产生消息。
可以通过在kafka容器中导航来进行验证:
docker exec -it <CONTAINER ID of Kafka Image> /bin/bash
当我在容器内手动运行以下脚本时
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic Topic01 --from-beginning
我可以看到正在生成的文本块。
但是当我尝试从图像consumer
的容器中读取相同的数据时,它给了我空白,
尝试的方法:
docker exec
在使用者容器内,并运行以下python代码:
from kafka import KafkaConsumer
consumer = KafkaConsumer('Topic01', bootstrap_servers='kafka:9092')
for messages in consumer:
print(messages)
它什么也不打印。
是因为我的docker-compose文件错误还是python代码中的错误?
答案 0 :(得分:1)
根据针对听众的Kafka文档:
侦听器列表-我们将在其上侦听的URI的逗号分隔列表和侦听器名称。如果侦听器名称不是安全协议,则还必须设置listener.security.protocol.map。将主机名指定为0.0.0.0以绑定到所有接口。 将主机名保留为空以绑定到默认接口。合法侦听器列表的示例:PLAINTEXT:// myhost:9092,SSL://:9091 CLIENT://0.0.0.0:9092,REPLICATION:// localhost:9093
您正在将KAFKA_LISTENERS
设置为PLAINTEXT://:9092
,因此它将绑定到默认界面,该界面可能无法从您的Kafka容器外部访问(同时,它可以与使用控制台的用户一起正常使用本地主机)。尝试一下,将KAFKA_LISTENERS
指定为PLAINTEXT://0.0.0.0:9092
,以检查您的使用者是否开始使用邮件。