我的组织最近从依赖 Zookeeper 的旧版本 Kafka 切换到了可以充当自己的代理的更新版本。不幸的是,这样做,他们破坏了我的工作流程。
我有一个小程序,旨在为特定主题生成卡夫卡消息。当我运行该程序的 docker 版本时,它会连接到 kafka 并按预期运行。当我尝试直接从 IDE 运行程序并连接到 dockerized kafka 集群时,我收到一个神秘的“客户端已耗尽可用的代理来与之对话:EOF”错误。
由于该程序在容器中运行时可以正常工作,因此我认为造成问题的根本原因是存在一些配置差异。此设置不使用 Zookeeper,不幸的是,我可以在网上找到的大多数文献都是关于如何使用Zookeeper 来完成这项工作,这与我们的组织不再相关。
Kafka 容器的 compose 文件:
# KAFKA
kafka:
<<: *logging
image: bitnami/kafka:3.5.1
labels:
niche.type: "kafka"
container_name: kafka
restart: unless-stopped
environment:
# Tell kafka that it's running in single-node mode
KAFKA_CFG_NODE_ID: 0
KAFKA_CFG_PROCESS_ROLES: controller,broker
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://localhost:29092
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://:9092,EXTERNAL://localhost:29092
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@kafka:9093
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: 'false'
KAFKA_CFG_DELETE_TOPIC_ENABLE: 'true'
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
networks:
- development
ports:
- 29092:29092
volumes:
- type: volume
source: kafka3-data
target: /bitnami/kafka
- type: tmpfs
target: /bitname/kafka/tmp
我的程序的 Docker 版本的 compose 块。它主要依赖于默认值
inventory:
<<: [ *dns, *logging ]
build:
context: ./inventory
dockerfile: ./cmd/inventory/Dockerfile
image: ${USER:?USER}/inventory:latest
container_name: inventory
env_file:
- urls.env
- inventory/cmd/inventory/docker.env
networks:
- development
ports:
- 4096:4096
depends_on:
postgres:
condition: service_started
kafka:
condition: service_healthy
其定义如下:
KAFKA_BROKERS=kafka:9092
我提供从 IDE 中运行我的程序
"args": [
"-kafka.brokers=localhost:29092"
]
我怀疑问题在于我没有以正确的方式访问 Kafka 容器——29092 对于容器来说是正确的,如果我瞄准不同的端口,我会收到“无法连接”错误——但我我不太确定听众是否//localhost:29092
。我认为这可能应该是
docker.host.internal
(指定该端口上来自主机的传入连接),但 Kafka 图像似乎不知道如何解释它。有什么关于我可能出错的地方的指示吗?此工作流程以前可以通过 Zookeeper 实现,因此我认为这只是一个配置问题,导致其无法按预期工作。在 Windows 上运行,物有所值。