При локальной разработке с Kafka могут возникнуть проблемы с доступом, если она запущена в Docker контейнере, и требуется обращение как изнутри Docker так и снаружи.
В Kafka запись и чтение осуществляется в ноду лидера для заданной партиции. Клиент может обратиться к любому узлу Kafka, чтобы узнать по какому адресу нужно делать операцию записи/чтения, даже если Kafka представлена одним узлом. Здесь и возникает путаница, если у вас несколько сетей (например, внешняя и внутренняя). Для внешнего пользователя нужно предоставить внешний адрес, а для внутреннего внутренний, соответственно.
Для решения этой проблемы будут использоваться два порта:
9092 - для доступа извне, в моем случае это хосте (мой компьютер)
29092 - порт для обращения к Kafka других контейнеров (например, Debezium) внутри Docker.
Пример такой собранной конфигурации (docker-compose.yaml):
version: '2' services: zookeeper: image: confluentinc/cp-zookeeper:5.4.0 environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 kafka: image: confluentinc/cp-kafka:5.4.0 ports: - 9092:9092 environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:29092,PLAINTEXT_HOST://0.0.0.0:9092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 connect: image: debezium/connect:1.4 ports: - 8083:8083 links: - kafka environment: - BOOTSTRAP_SERVERS=PLAINTEXT://kafka:29092 - GROUP_ID=1 - CONFIG_STORAGE_TOPIC=dbz_connect_configs - OFFSET_STORAGE_TOPIC=dbz_connect_offsets - STATUS_STORAGE_TOPIC=dbz_connect_statuses |
https://www.confluent.io/blog/kafka-client-cannot-connect-to-broker-on-aws-on-docker-etc/