我的应用程序都不能看到我的Kafka,即使它们运行在同一个网络上,

wqsoz72f  于 2023-06-21  发布在  Apache
关注(0)|答案(2)|浏览(113)

我的docker-compose.yml文件是:

version: '3'
services:
  kafka1:
    image: confluentinc/cp-kafka:7.3.2
    volumes:
      - ./init-scripts/kafka:/docker-entrypoint-initdb.d
    ports:
      - "9092:9092"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zoo1:2181
      KAFKA_LISTENERS: INTERNAL://:9092,EXTERNAL://:9093
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka1:9092,EXTERNAL://localhost:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    depends_on:
      - zoo1
    networks:
      - mynetwork

  zoo1:
    image: confluentinc/cp-zookeeper:7.3.2
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    networks:
      - mynetwork

  cassandra:
    image: cassandra:latest
    volumes:
      - ./init-scripts/cassandra:/docker-entrypoint-initdb.d
    ports:
      - "9042:9042"

  flask-app:
    build: .
    volumes:
      - .:/app
    ports:
      - "5000:5000"
    depends_on:
      - kafka1
      - cassandra

networks:
  mynetwork:
    driver: bridge

我有一个flask服务器在此运行,但它给了我NoBrokersAvaliable错误。即使我的Kafka和应用程序运行在同一个网络上,它们也无法相互通信。
我有另一个名为esp32_simulator的容器,它有一个像这样的docker-compose文件:

version: '3'
services:

  esp32_simulator:
    build: .
    volumes:
      - ./:/app
    networks:
      - mynetwork

networks:
  mynetwork:
    external:
      name: bitirmetam_mynetwork

但是当我用kafka 1:9092运行这个应用程序时,它也显示NoBrokersAvaliable。我尝试了localhost和一切,但仍然给出错误。

fykwrbwg

fykwrbwg1#

我看到的一个问题是,你暴露了9092后,这是内部配置,但你应该暴露端口9093。
当你连接到一个Kafka broker时,应用程序连接到一个kafka broker,broker在内部查看它应该使用哪个连接(在你的例子中是INTERNAL或EXTERNAL)。由于您通过9092连接,因此它将使用INTERNAL。
然后代理查看“AdvertisedListener”列表中的internal,并返回该值,即

http://KAFKA:9092

但是如果你从Docker网络外部连接,这个URL就不起作用了。
同样,只需将暴露的端口从9092:9092更改为9093:9093,它就应该可以工作

6ju8rftf

6ju8rftf2#

在同一个网络上
但他们不是。您的flask应用未使用mynetwork
在flask应用程序中使用localhost也不是Kafka代理的地址
同样不清楚你的Kafka客户端进程从哪里开始,因为你没有显示代码,但是Confluent容器需要大约20秒才能完全启动,而depends_on不会等待这个时间。在创建Kafka客户端之前,您需要在Python代码的某个地方添加显式的sleep/port check/retry-loop

相关问题