Не могу подключиться к контейнеру kafka в локальной сети

Я запускаю экземпляр zookeeper и kafka из файла docker yaml в моей Ubuntu 18.04.

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localhost
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CREATE_TOPICS: "test-topic:5:2"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

это работает как

CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                                NAMES
d3d84a6b39f7   wurstmeister/kafka          "start-kafka.sh"         3 minutes ago   Up 3 minutes   0.0.0.0:49157->9092/tcp                              desktop_kafka_1
b2012f08b3f9   wurstmeister/zookeeper      "/bin/sh -c '/usr/sb…"   5 hours ago     Up 3 minutes   22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   desktop_zookeeper_1

однако клиент kafka не смог подключить kafka как

const { Kafka,logLevel,CompressionCodecs,CompressionTypes } = require('kafkajs');
const kafka = new Kafka({
  logLevel: logLevel.DEBUG,
  brokers: ['localhost:9092'],   // tried on ['192.168.1.6:9092']
  clientId: 'example-producer',
})

const topic = 'topic-test'
const producer = kafka.producer()

const getRandomNumber = () => Math.round(Math.random(10) * 1000)
const createMessage = num => ({
  key: `key-${num}`,
  value: `value-${num}-${new Date().toISOString()}`,
})

const sendMessage = () => {
  return producer
    .send({
      topic,
      compression: CompressionTypes.GZIP,
      messages: Array(getRandomNumber())
        .fill()
        .map(_ => createMessage(getRandomNumber())),
    })
    .then(console.info)
    .catch(e => console.error(`[example/producer] ${e.message}`, e))
}

const run = async () => {
  await producer.connect()
  setInterval(sendMessage, 3000)
}

run().catch(e => console.error(`[example/producer] ${e.message}`, e))

вывод кода

    [example/producer] Connection error: connect ECONNREFUSED 127.0.0.1:9092 KafkaJSNonRetriableError
  Caused by: KafkaJSConnectionError: Connection error: connect ECONNREFUSED 127.0.0.1:9092
    at Socket.onError (/home/xsz/Desktop/node_modules/kafkajs/src/network/connection.js:152:23)
    at Socket.emit (events.js:314:20)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  name: 'KafkaJSNumberOfRetriesExceeded',
  retriable: false,
  helpUrl: undefined,
  originalError: KafkaJSConnectionError: Connection error: connect ECONNREFUSED 127.0.0.1:9092
      at Socket.onError (/home/xsz/Desktop/node_modules/kafkajs/src/network/connection.js:152:23)
      at Socket.emit (events.js:314:20)
      at emitErrorNT (internal/streams/destroy.js:92:8)
      at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
      at processTicksAndRejections (internal/process/task_queues.js:84:21) {
    retriable: true,
    helpUrl: undefined,
    broker: 'localhost:9092',
    code: 'ECONNREFUSED'
  },
  retryCount: 5,
  retryTime: 10304
}

В docker-compose.ymal KAFKA_ADVERTISED_HOST_NAME настроен как localhost или 192.168.1.6 (локальный IP-адрес хост-машины), оба показывают ту же ошибку, что и выше.

примечание: используя

вывод команды ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> 
    inet 127.0.0.1/8 scope host lo

3: wlx08570033e6c1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 
   inet 192.168.1.6/24 brd 192.168.1.255 scope global noprefixroute wlx08570033e6c1

4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

5: br-c66cb3672872: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu inet 172.18.0.1/16 brd 172.18.255.255 scope global br-c66cb3672872

22: br-521b1eb41768: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 
    inet 172.19.0.1/16 brd 172.19.255.255 scope global br-521b1eb41768

последняя попытка:

Я внес изменения в файл docker-compose.yaml.

  KAFKA_ADVERTISED_HOST_NAME: 172.17.0.1
  KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

и запуск кода на хост-компьютере.

const kafka = new Kafka({
  logLevel: logLevel.DEBUG,
  brokers: ['172.17.0.1:9092'],   // tried on ['192.168.1.6:9092']
  clientId: 'example-producer',
})

но все еще сталкиваюсь с той же проблемой, что не так

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 653
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Необходимо внести некоторые изменения

сначала измените узел подключения на localhost

const kafka = new Kafka({
    logLevel: logLevel.DEBUG,
    brokers: ['localhost:9092'],  
    clientId: 'example-producer',
})

затем внутри файла docker-compose изменить ports и добавить links

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    links:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localhost
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CREATE_TOPICS: "test-topic:5:2"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

в последний раз вы используете только одного брокера в своем компоновочном файле

Я смотрю на вашу конфигурацию с помощью Kafka-tool2.0, кажется, что есть только один раздел для «topic-test», поэтому вы видите эту ошибку, используйте больше брокеров, чтобы избежать этого.

 {"level":"DEBUG","timestamp":"2020-12-15T07:54:05.315Z","logger":"kafkajs","message":"[Connection] Request Metadata(key: 3, version: 6)","broker":"localhost:9092","clientId":"example-producer","correlationId":25,"expectResponse":true,"size":47}There is no listener on the leader broker that matches the listener on which metadata request was processed KafkaJSNonRetriableError Caused by: KafkaJSProtocolError: There is no listener on the leader broker that matches the listener on which metadata request was processed.

Попробовано на Linux Mint 20

выход:

{"level":"DEBUG","timestamp":"2020-12-15T06:55:59.662Z","logger":"kafkajs","message":"[Connection] Response Produce(key: 0, version: 7)","broker":"localhost:9092","clientId":"example-producer","correlationId":46,"size":58,"data":{"topics":[{"topicName":"topic-test","partitions":[{"partition":0,"errorCode":0,"baseOffset":"18379","logAppendTime":"-1","logStartOffset":"0"}]}],"throttleTime":0,"clientSideThrottleTime":0}}
[
  {
    topicName: 'topic-test',
    partition: 0,
    errorCode: 0,
    baseOffset: '18379',
    logAppendTime: '-1',
    logStartOffset: '0'
  }
]

кажется, кафка подключена, но возникает другая проблема, говорящая {"level": "DEBUG", "timestamp": "2020-12-15T07:54:05.315Z", "log‌​ger":"kafkajs","mess‌​ age":"[Connection] Request Metadata(key: 3, version: 6)","broker":"localhost:9092","clientId":"example-producer",‌​"correlationId":25,"‌ ​expectResponse":true‌​,"size":47} На ведущем брокере нет прослушивателя, который соответствует прослушивателю, на котором был обработан запрос метаданных. какой запрос метаданных был обработан.

user824624 15.12.2020 08:56

я смотрю на вашу конфигурацию с помощью Kafka-tool2.0, кажется, что есть только один раздел для «topic-test», поэтому вы видите эту ошибку

Naor Tedgi 15.12.2020 10:29

Я так понимаю, вы имеете в виду тестовую тему: 5:2, это 5 разделов и 2 реплики. если мне нужно сделать 5 разделов, то мне нужно построить кластер kafka с 5 экземплярами kafka, не так ли?

user824624 16.12.2020 06:59

Вы неправильно сопоставили порт своего экземпляра kafka в файле компоновки докеров, который вы должны изменить

ports:
  - "9092"

с

ports:
  - "9092:9092"

так как теперь ваш контейнер получает произвольный порт 0.0.0.0:49157->9092/tcp

Другие вопросы по теме