编辑此页面

Kafka 的 Dev Services

如果存在任何与 Kafka 相关的扩展(例如 quarkus-messaging-kafka),用于 Kafka 的开发服务会自动在开发模式和运行测试时启动 Kafka 代理。因此,您不必手动启动代理。应用程序会自动配置。

由于启动 Kafka 代理可能需要很长时间,用于 Kafka 的开发服务使用 Redpanda,这是一个 Kafka 兼容的代理,启动时间约为 1 秒。

启用/禁用用于 Kafka 的开发服务

除非满足以下条件,否则会自动启用用于 Kafka 的开发服务

  • quarkus.kafka.devservices.enabled 设置为 false

  • 已配置 kafka.bootstrap.servers

  • 所有 Reactive Messaging Kafka 通道都设置了 bootstrap.servers 属性

用于 Kafka 的开发服务依赖于 Docker 启动代理。如果您的环境不支持 Docker,您需要手动启动代理,或连接到已运行的代理。您可以使用 kafka.bootstrap.servers 配置代理地址。

共享消息代理

大多数情况下,您需要在应用程序之间共享代理。用于 Kafka 的开发服务实现了一种服务发现机制,使您在开发模式下运行的多个 Quarkus 应用程序可以共享单个代理。

用于 Kafka 的开发服务使用 quarkus-dev-service-kafka 标签启动容器,该标签用于标识容器。

如果您需要多个(共享)代理,您可以配置 quarkus.kafka.devservices.service-name 属性并指示代理名称。它会查找具有相同值的容器,如果找不到,则启动一个新容器。默认服务名称为 kafka

默认情况下,在开发模式下启用共享,但在测试模式下禁用。您可以使用 quarkus.kafka.devservices.shared=false 禁用共享。

设置端口

默认情况下,用于 Kafka 的开发服务会选择一个随机端口并配置应用程序。您可以通过配置 quarkus.kafka.devservices.port 属性来设置端口。

请注意,Kafka 广播地址会自动配置为所选端口。

配置镜像

用于 Kafka 的开发服务支持 Redpandakafka-nativeStrimzi(在 Kraft 模式下)镜像。

Redpanda 是一个 Kafka 兼容的事件流平台。由于它提供了快速启动时间,因此开发服务默认使用来自 redpandadata/redpanda 的 Redpanda 镜像。您可以从 https://hub.docker.com/r/redpandadata/redpanda 中选择任何版本。

kafka-native 提供了使用 Quarkus 和 GraalVM 编译为原生二进制文件的标准 Apache Kafka 发行版镜像。虽然仍处于实验性阶段,但它提供了非常快的启动时间和小的占用空间。

可以使用以下方法配置镜像类型

quarkus.kafka.devservices.provider=kafka-native

Strimzi 提供了用于在 Kubernetes 上运行 Apache Kafka 的容器镜像和 Operators。虽然 Strimzi 针对 Kubernetes 进行了优化,但这些镜像在经典的容器环境中也能完美运行。Strimzi 容器镜像在 JVM 上运行“真正的”Kafka 代理,启动速度较慢。

quarkus.kafka.devservices.provider=strimzi

对于 Strimzi,您可以从 https://quay.io/repository/strimzi-test-container/test-container?tab=tags 中选择任何具有 Kafka 版本且支持 Kraft(2.8.1 及更高版本)的镜像

quarkus.kafka.devservices.image-name=quay.io/strimzi-test-container/test-container:0.106.0-kafka-3.7.0

配置 Kafka 主题

您可以配置用于 Kafka 的开发服务以在代理启动后创建主题。使用给定的分区数和 1 个副本创建主题。

以下示例创建一个名为 test 的主题,具有 3 个分区,以及一个名为 messages 的第二个主题,具有 2 个分区。

quarkus.kafka.devservices.topic-partitions.test=3
quarkus.kafka.devservices.topic-partitions.messages=2

如果具有给定名称的主题已存在,则会跳过创建,而不会尝试将现有主题重新分区为不同的分区数。

您可以使用 quarkus.kafka.devservices.topic-partitions-timeout 配置 Kafka 管理客户端调用(用于主题创建)的超时时间,默认值为 2 秒。

事务性和幂等性生产者支持

默认情况下,Redpanda 代理配置为启用事务和幂等性功能。您可以使用以下方法禁用这些功能

quarkus.kafka.devservices.redpanda.transaction-enabled=false
Redpanda 事务不支持精确一次处理。

Compose

Kafka 开发服务支持 Compose 开发服务。它依赖于 compose-devservices.yml,例如

name: <application name>
services:
  kafka:
    image: apache/kafka-native:3.9.0
    restart: "no"
    ports:
      - '9092'
    labels:
      io.quarkus.devservices.compose.exposed_ports: /etc/kafka/docker/ports
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_NUM_PARTITIONS: 3
    command: "/kafka.sh"
    volumes:
      - './kafka.sh:/kafka.sh'

为了使代理将其外部可访问的地址广播给客户端,它需要一个额外的文件 kafka.sh,如 将端口映射暴露给运行中的容器 中所述。

配置参考

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

是否已显式启用或禁用用于 Kafka 的开发服务。通常默认启用开发服务,除非存在现有配置。对于 Kafka,除非设置了 kafka.bootstrap.servers,或者所有 Reactive Messaging Kafka 通道都配置了 bootstrap.servers,否则开发服务会启动代理。

环境变量:QUARKUS_KAFKA_DEVSERVICES_ENABLED

显示更多

布尔值

开发服务将侦听的可选固定端口。

如果未定义,将随机选择端口。

环境变量:QUARKUS_KAFKA_DEVSERVICES_PORT

显示更多

整数

Kafka 开发服务容器类型。

支持 Redpanda、Strimzi 和 kafka-native 容器提供程序。默认为 redpanda。

请注意,Strimzi 和 Kafka Native 镜像以 Kraft 模式启动。

环境变量:QUARKUS_KAFKA_DEVSERVICES_PROVIDER

显示更多

redpandastrimzikafka-native

redpanda

要使用的 Kafka 容器镜像。

取决于提供程序。

环境变量:QUARKUS_KAFKA_DEVSERVICES_IMAGE_NAME

显示更多

字符串

指示由 Quarkus 开发服务管理的 Kafka 代理是否共享。共享时,Quarkus 会使用基于标签的服务发现来查找正在运行的容器。如果找到匹配的容器,则会使用该容器,因此不会启动第二个容器。否则,用于 Kafka 的开发服务会启动一个新容器。

发现使用 quarkus-dev-service-kafka 标签。该值使用 service-name 属性配置。

容器共享仅在开发模式下使用。

环境变量:QUARKUS_KAFKA_DEVSERVICES_SHARED

显示更多

布尔值

true

附加到启动容器的 quarkus-dev-service-kafka 标签的值。当 shared 设置为 true 时,将使用此属性。在这种情况下,在启动容器之前,用于 Kafka 的开发服务会查找 quarkus-dev-service-kafka 标签设置为配置值的容器。如果找到,它将使用此容器而不是启动新容器。否则,它会启动一个新容器,并将 quarkus-dev-service-kafka 标签设置为指定的值。

当您需要多个共享 Kafka 代理时,将使用此属性。

环境变量:QUARKUS_KAFKA_DEVSERVICES_SERVICE_NAME

显示更多

字符串

kafka

要在开发服务 Kafka 代理中创建的主题-分区对。启动代理后,将创建给定的主题和分区,跳过已存在的主题。例如,quarkus.kafka.devservices.topic-partitions.test=2 将创建一个名为 test 的主题,具有 2 个分区。

主题创建不会尝试重新分区具有不同分区数的现有主题。

环境变量:QUARKUS_KAFKA_DEVSERVICES_TOPIC_PARTITIONS__TOPIC_NAME_

显示更多

Map<String,Integer>

用于主题创建的管理客户端调用的超时。

默认为 2 秒。

环境变量:QUARKUS_KAFKA_DEVSERVICES_TOPIC_PARTITIONS_TIMEOUT

显示更多

Duration 

2S

传递给容器的环境变量。

环境变量:QUARKUS_KAFKA_DEVSERVICES_CONTAINER_ENV__ENVIRONMENT_VARIABLE_NAME_

显示更多

Map<String,String>

启用事务支持。还会启用生产者幂等性。有关 Redpanda 事务支持的更多信息,请参见 https://vectorized.io/blog/fast-transactions/。请注意,KIP-447(精确一次语义的生产者可扩展性)KIP-360(提高幂等性/事务性生产者的可靠性)不受支持。

环境变量:QUARKUS_KAFKA_DEVSERVICES_REDPANDA_TRANSACTION_ENABLED

显示更多

布尔值

true

用于访问 Redpanda HTTP 代理 (pandaproxy) 的端口。

如果未定义,将随机选择端口。

环境变量:QUARKUS_KAFKA_DEVSERVICES_REDPANDA_PROXY_PORT

显示更多

整数

关于 Duration 格式

要写入 duration 值,请使用标准 java.time.Duration 格式。有关更多信息,请参见 Duration#parse() Java API 文档

您还可以使用简化的格式,以数字开头

  • 如果该值仅为一个数字,则表示以秒为单位的时间。

  • 如果该值是一个数字后跟 ms,则表示以毫秒为单位的时间。

在其他情况下,简化格式将被转换为 java.time.Duration 格式以进行解析

  • 如果该值是一个数字后跟 hms,则在其前面加上 PT

  • 如果该值是一个数字后跟 d,则在其前面加上 P

相关内容