我正在开发一个应用程序,该应用程序从 sqs 队列中读取一条消息,对该数据执行一些操作,然后获取结果并将其发布到 kafka 主题。为了在本地进行测试,我想在我的 docker 构建中设置一个 kafka 图像。我目前能够使用 docker-compose 在本地启动 aws-cli、localstack 和我的应用程序的容器。另外,我也可以毫无问题地启动 kafka 和 zookeper。我无法让我的应用程序与 kafka 通信。

我试过使用两个单独的撰写文件,也尝试过网络。最后,我引用了:https://rmoff.net/2018/08/02/kafka-listeners-explained/

这是我的 docker-compose 文件:

version: '3.7' 
services: 
  localstack: 
    image: localstack/localstack:latest 
    container_name: localstack 
    env_file: .env 
    ports: 
      # Localstack endpoints for various API. Format is localhost:container 
      - '4563-4584:4563-4584' 
      - '8080:8080' 
    environment: 
      - SERVICES=sns:4575,sqs:4576 
      - DATA_DIR=/tmp/localstack/data 
    volumes: 
      # store data locally in 'localstack' folder 
      - './localstack:/tmp/localstack' 
    networks: 
      - my_network 
 
  aws: 
    image: mesosphere/aws-cli 
    container_name: aws-cli 
    # copy local JSON_DATA folder contents into aws-cli container's app folder 
    #volumes: 
    #  - ./JSON_DATA:/app 
    env_file: .env 
    # bash entrypoint needed for multiple commands 
    entrypoint: /bin/sh -c 
    command: > 
      " sleep 10; 
        aws --endpoint-url=http://localstack:4576 sqs create-queue --queue-name input_queue; 
        aws --endpoint-url=http://localstack:4575 sns create-topic --name input_topic; 
        aws --endpoint-url=http://localstack:4575 sns subscribe --topic-arn arn:aws:sns:us-east-2:123456789012:example_topic --protocol sqs --notification-endpoint http://localhost:4576/queue/input_queue; " 
    networks: 
      - my_network 
    depends_on: 
      - localstack 
 
  my_app: 
    build: . 
    image: my_app 
    container_name: my_app 
    env_file: .env 
    ports: 
      - '9000:9000' 
    networks: 
      - my_network 
    depends_on: 
      - localstack 
      - aws 
 
  zookeeper: 
    image: confluentinc/cp-zookeeper:5.0.0 
    container_name: zookeeper 
    ports: 
      - 2181:2181 
    environment: 
      ZOOKEEPER_CLIENT_PORT: 2181 
    networks: 
      - my_network 
 
  kafka: 
    image: confluentinc/cp-kafka:5.0.0 
    ports: 
      - 9092:9092 
    depends_on: 
      - zookeeper 
    environment: 
      # For more details see See https://rmoff.net/2018/08/02/kafka-listeners-explained/ 
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 
      KAFKA_ADVERTISED_LISTENERS: INSIDE://localhost:9092 
      KAFKA_LISTENERS: INSIDE://localhost:9092 
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT 
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE 
      KAFKA_CREATE_TOPICS: "output_topic:2:2" 
    networks: 
      - my_network 
 
networks: 
  my_network: 

我希望发布到该主题时不会出现任何错误。相反,我得到:

kafka: client has run out of available brokers to talk to (Is your cluster reachable?) 

任何想法我可能做错了什么?感谢您的帮助。

请您参考如下方法:

通过将监听器设置为仅本地主机,您已经使代理只能在 Kafka 容器本身(或从您的主机到容器)内解析。

如果您希望另一个 Docker 服务能够访问该容器,您必须添加 <some protocol>://kafka:<some port>广告听众,并制作listeners因为不是本地主机

协议(protocol)也添加到 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP

FWIW,该博客应该涵盖所有这些基础。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!