无法与aws示例上的kafka代理对话

hgqdbh6s  于 2021-06-05  发布在  Kafka
关注(0)|答案(0)|浏览(217)

我知道这个问题经常出现。我读过很多帖子和博客,但我在这里。长话短说,我有一个docker容器运行wurstmeister/zookeeper&wurstmeister/kafka,然后一些服务在它们自己的容器中运行。我现在只提noddj一个。在家里一切都很好,使用ip地址(而不是本地主机),所以我对这里的区别感到困惑。在aws上,它只是“不起作用”,尽管它似乎至少在一开始就连接到了代理。我在配置中显式地使用内部IP,因为我不希望它暴露在任何外部。
在阅读中,我尝试了两种设置。1.在家工作(Kafka\主持人\姓名)。1没有(Kafka的听众)。在我的ec2 linux设备上都不起作用:
Kafkadocker-compose.yml

version: '2'

services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
    networks:
      - my-network

  kafka:
    image: wurstmeister/kafka
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: <internal-ip>
      KAFKA_ADVERTISED_PORT: "9092"
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

    networks:
      - my-network

networks:
  my-network:

nodejs docker-compose.yml文件

version: '2'

services:
  nodejs:
    build:
      context: ./
      dockerfile: Dockerfile
    networks:
      - kafka_my-network
    restart: unless-stopped
    ports:
      - "1337:3000"
    volumes:
      - "/tmp:/tmp"
      - "/var/log:/var/log"

networks:
  kafka_my-network:
    external: true

然后在nodejs

const kafkaHost = '<internal-ip>:9092';
const client = new kafka.KafkaClient({kafkaHost});
const producer = new kafka.Producer(client)
const kakfaTopic = 'test';

producer.on('ready', function() {
  console.log(`kafka producer is ready`); // I see this, so I'm assuming all is well
  ready = true;
});

producer.on('error', function(err) {
  console.error(err);
});

const payload = [
  {
    topic: kafkaTopic,
    messages: JSON.stringify(myMessages);
  }
]

producer.send(payload, function(err, data) {
  if (err) {
    console.error(`Send error ${JSON.stringify(err}`);
  }

  console.log(`Sent data ${JSON.stringify(data)}`);
});

当我启动nodejs服务器时,我看到我已经连接到一个kafka代理。我也可以确认:9092在检查w/telnet和/或nc后是打开的。然后,当它发送请求时,回调得到一个空错误。
我意识到kakfa\u播发的\u主机\u名称已被弃用,因此以完成的名义,下面是我使用播发的\u侦听器的尝试,但失败了。通过这种配置,我在家里得到的结果似乎和在ec2上得到的结果一样。

version: '2'

services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
    networks:
      - my-network

  kafka:
    image: wurstmeister/kafka
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://<internal-ip>:9092
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

    networks:
      - my-network

networks:
  my-network:

编辑:我不会提供这个作为解决方案,但bitnami图像与以下配置工作。主要的区别是它有一个非常直接的自述,我通过。我不能确定我是否尝试了等效的配置w/wurstmeister(我尝试了很多次,而且一次又一次,其中至少有一次是在我自己的机器上的docker容器中,但不是在一个ec2示例上)。
请注意,我确实在/etc/hosts中列出了带有内部ip(而不是环回)的“kafka”。这应该等同于显式地使用我在上面所做的内部ip。

version: '2'

services:
  zookeeper:
    image: 'bitnami/zookeeper:3'
    ports:
      - '2181:2181'
    volumes:
      - 'zookeeper_data:/bitnami'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
    networks:
      - my-network

  kafka:
    image: 'bitnami/kafka:2'
    ports:
      - '9092:9092'
      - '29092:29092'
    volumes:
      - 'kafka_data:/bitnami'
      - /var/run/docker.sock:/var/run/docker.sock   
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
    depends_on:
      - zookeeper
    networks:
      - my-network

volumes:
  zookeeper_data:
    driver: local
  kafka_data:
    driver: local

networks:
  my-network:
    driver: bridge

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题