docker-compose中的Kafka Streams需要很长时间才能进行分区

时间:2018-01-05 16:36:35

标签: docker apache-kafka docker-compose apache-kafka-streams

我在Docker容器中运行Kafka流应用程序。出于测试目的,我有一个docker-compose文件,它运行流应用程序,kafka的单个实例和zookeeper。 kafka和zookeeper的配置以前都有用。

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

似乎正在实例化kafka流组,但是,应用程序没有分配任何分区。这可能是因为该主题尚未完全实例化。直到下一代才开始分配分区,这似乎花了将近5分钟。

在我(有限)对情况的理解中,我有一些减少这种延迟的选择:

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

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

编辑:docker-compose文件以供参考

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 个答案:

答案 0 :(得分:4)

我找到了一个临时解决方案,可以在有限的情况下工作(只需要在本地进行测试,或通过集成测试)。我不会将此标记为已解决以便提供更好的答案。

本质上,流应用程序在分区准备好之前要求元数据。卡夫卡说“还没有分区”。并且应用程序说好了没有分配用于分配',然后等待(可配置的)时间量,直到分区元数据变得陈旧。然后它向kafka发出另一个请求,此时已经创建了分区。

指示此刷新间隔的配置为kafka.metadata.max.age.ms。我把它设置为1000毫秒。