代码之家  ›  专栏  ›  技术社区  ›  shaftoes

docker compose中的Kafka流需要很长时间才能分配分区

  •  5
  • shaftoes  · 技术社区  · 8 年前

    我正在docker容器中运行Kafka流应用程序。出于测试目的,我有一个运行流应用程序的docker compose文件、一个kafka实例和zookeeper。卡夫卡和zookeeper的配置以前都可以使用。

    为kafka流媒体应用程序分配分区需要5分钟以上的时间。如果我延迟运行流容器,直到kafka和zookeeper启动,并且流应用程序正在使用的主题已正确实例化,那么它几乎会立即获得分配的分区。

    看起来kafka流组正在实例化,但应用程序没有分配任何分区。这大概是因为主题尚未完全实例化。在下一代之前,它不会分配分区,这似乎需要大约5分钟的时间。

    根据我(有限的)对情况的理解,我有几个选项可以减少这种延迟:

    • 启动流媒体应用程序之前,请检查主题是否包含元数据
    • 减少两代之间的间隔(似乎这可能会在生产中出现问题,但可能适合测试)

    然而,考虑到我在这方面的知识有限,我意识到我可能遗漏了一些显而易见的东西。

    编辑:docker撰写文件以供参考

    version: 3.3
    services:
        kafka-stream-ingestor:
          build:
            context: .
            dockerfile: Dockerfile
            args:
              - version
    
          networks:
            - services
    
        zookeeper:
            image: wurstmeister/zookeeper
            ports:
              - 2181:2181
            networks:
              - services
    
        kafka:
          image: wurstmeister/kafka:latest
          ports:
            - 9094:9094
            - 9092:9092
          environment:
            KAFKA_ADVERTISED_HOST_NAME: ${DOCKER_KAFKA_HOST}
            KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
            KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
            KAFKA_ADVERTISED_PROTOCOL_NAME: OUTSIDE
            KAFKA_ADVERTISED_PORT: 9094
            KAFKA_CREATE_TOPICS: "kafka-queue:12:1"
            KAFKA_PROTOCOL_NAME: INSIDE
            KAFKA_PORT: 9092
          volumes:
            - /var/run/docker.sock:/var/run/docker.sock
          networks:
            - services
    
      networks:
        services:
    
      volumes:
        testresult:
    
    1 回复  |  直到 8 年前
        1
  •  5
  •   shaftoes    8 年前

    我找到了一个临时解决方案,它可以在有限的环境下工作(仅在本地测试或通过集成测试时需要)。为了得到更好的答案,我不会将此标记为已解决。

    实际上,流应用程序在分区准备就绪之前请求元数据。kafka说“还没有分区”,应用程序说“好的,没有分区可分配”,然后等待(可配置)一段时间,直到分区元数据过时。然后,它向卡夫卡发出另一个请求,此时卡夫卡已经创建了分区。

    指定此刷新间隔的配置为 kafka.metadata.max.age.ms . 我将其设置为1000ms。

    推荐文章