docker -compose kafka - клиент локальной машины не может выдать сообщение для kafka - PullRequest
0 голосов
/ 12 марта 2020

Я читал много похожих тем, но они не могут ответить на мою проблему здесь.

Пытаясь выполнить несколько коротких интеграционных тестов, я использую docker -compose 3, a одноузловая кафка. На стороне клиента я использую Go shopify / sarama для потребления / производства

zookeeper:
  image: confluentinc/cp-zookeeper:5.2.2
  hostname: zookeeper
  container_name: zookeeper
  ports:
    - "2181:2181"
  environment:
    ZOOKEEPER_CLIENT_PORT: 2181
    ZOOKEEPER_TICK_TIME: 2000
kafka:
  image: confluentinc/cp-enterprise-kafka:5.2.2
  hostname: kafka
  container_name: kafka
  depends_on:
    - zookeeper
  ports:
    - "29092:29092"
  expose:
    - 9092
  environment:
    KAFKA_BROKER_ID: 1
    KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
    KAFKA_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
    KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
    KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
    KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

У меня есть другой контейнер из docker -композиции, который будет слушать

- "BROKERS_URL=kafka:9092"

потребитель работает нормально:

Сарама работает и работает. {"brokers": ["kafka: 9092"], "themes": ["validated"], "group": "event-service"}

Но на стороне производителя, работает напрямую с моей машины:

kafka: у клиента кончились доступные брокеры, с которыми можно поговорить (Ваш кластер достижим?)

producer, err := sarama.NewSyncProducer([]string{"http://localhost:29092"}, nil)
...
msg := &sarama.ProducerMessage{
    Topic: "validated",
    Key:   sarama.StringEncoder(""),
    Value: sarama.ByteEncoder(payload),
}

partition, offset, err := producer.SendMessage(msg)
...

Ничего странного / экстравагантного здесь, но это не работает, и я в замешательстве.

также: nc -vz localhost 29092

Подключение к локальному порту 29092 [tcp / *] успешно!

1 Ответ

0 голосов
/ 12 марта 2020

Вместо

    KAFKA_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092

вам нужно

    KAFKA_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://0.0.0.0:29092

Проверка подключения с моего хост-компьютера с помощью kafkacat показывает, что это работает:

➜ kafkacat -b localhost:29092 -L
Metadata for all topics (from broker 1: localhost:29092/1):
 1 brokers:
  broker 1 at localhost:29092 (controller)
 0 topics:

Эта разница заключается в том, что слушатель привязан ко всем доступным интерфейсам (0.0.0.0). В исходной конфигурации он привязывается к интерфейсу обратной связи (lo) для localhost, и поэтому принимает только трафик c для этого, а не извне.

...