При локальной разработке с 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
p.s. Если у вас другая ситациация, то рекомендую посмотреть статью:
https://www.confluent.io/blog/kafka-client-cannot-connect-to-broker-on-aws-on-docker-etc/
Добавить комментарий