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 的开发服务支持 Redpanda、kafka-native 和 Strimzi(在 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 开发服务容器类型。 支持 Redpanda、Strimzi 和 kafka-native 容器提供程序。默认为 redpanda。 对于 Redpanda:请参见 https://docs.redpanda.com/current/get-started/quick-start/ 和 https://hub.docker.com/r/redpandadata/redpanda 对于 Strimzi:请参见 https://github.com/strimzi/test-container 和 https://quay.io/repository/strimzi-test-container/test-container 对于 Kafka Native:请参见 https://github.com/ozangunalp/kafka-native 和 https://quay.io/repository/ogunalp/kafka-native 请注意,Strimzi 和 Kafka Native 镜像以 Kraft 模式启动。 环境变量: 显示更多 |
|
|
要使用的 Kafka 容器镜像。 取决于提供程序。 环境变量: 显示更多 |
字符串 |
|
指示由 Quarkus 开发服务管理的 Kafka 代理是否共享。共享时,Quarkus 会使用基于标签的服务发现来查找正在运行的容器。如果找到匹配的容器,则会使用该容器,因此不会启动第二个容器。否则,用于 Kafka 的开发服务会启动一个新容器。 发现使用 容器共享仅在开发模式下使用。 环境变量: 显示更多 |
布尔值 |
|
附加到启动容器的 当您需要多个共享 Kafka 代理时,将使用此属性。 环境变量: 显示更多 |
字符串 |
|
要在开发服务 Kafka 代理中创建的主题-分区对。启动代理后,将创建给定的主题和分区,跳过已存在的主题。例如, 主题创建不会尝试重新分区具有不同分区数的现有主题。 环境变量: 显示更多 |
Map<String,Integer> |
|
用于主题创建的管理客户端调用的超时。 默认为 2 秒。 环境变量: 显示更多 |
|
|
传递给容器的环境变量。 环境变量: 显示更多 |
Map<String,String> |
|
启用事务支持。还会启用生产者幂等性。有关 Redpanda 事务支持的更多信息,请参见 https://vectorized.io/blog/fast-transactions/。请注意,KIP-447(精确一次语义的生产者可扩展性) 和 KIP-360(提高幂等性/事务性生产者的可靠性)不受支持。 环境变量: 显示更多 |
布尔值 |
|
用于访问 Redpanda HTTP 代理 (pandaproxy) 的端口。 如果未定义,将随机选择端口。 环境变量: 显示更多 |
整数 |
关于 Duration 格式
要写入 duration 值,请使用标准 您还可以使用简化的格式,以数字开头
在其他情况下,简化格式将被转换为
|