Apache Kafka是一个开源分布式事件流平台


Apache Kafka 是一个开源分布式事件流平台,数千家公司将其用于高性能数据管道、流分析、数据集成和关键任务应用程序。

您需要安装 Java

我们使用 17 和 24 版本构建和测试 Apache Kafka。javac 中的 release 参数对于客户端和流模块设置为 11,其余模块设置为 17,以确保与它们各自的最低 Java 版本兼容。
同样,scalac 中的 release 参数对于流模块设置为 11,其余模块设置为 17

Scala 2.13 是 Apache Kafka 唯一支持的版本。

构建并运行 jar 包

language 复制代码
./gradlew jar

请按照 https://kafka.apache.org/quickstart 中的说明操作

构建源 jar 包

language 复制代码
./gradlew srcJar

构建聚合 javadoc 包

language 复制代码
./gradlew aggregatedJavadoc

构建 javadoc 和 scaladoc 包

language 复制代码
./gradlew javadoc
./gradlew javadocJar # 为每个模块构建 javadoc jar 包
./gradlew scaladoc
./gradlew scaladocJar # 为每个模块构建 scaladoc jar 包
./gradlew docsJar # 为每个模块构建 javadoc 和 scaladoc jar 包(如果适用)

运行单元/集成测试

language 复制代码
./gradlew test # 运行单元测试和集成测试
./gradlew unitTest
./gradlew integrationTest
./gradlew test -Pkafka.test.run.flaky=true # 运行标记为不稳定的测试

强制重新运行测试而不更改代码

language 复制代码
./gradlew test --rerun-tasks
./gradlew unitTest --rerun-tasks
./gradlew integrationTest --rerun-tasks

运行特定的单元/集成测试

language 复制代码
./gradlew clients:test --tests RequestResponseTest
./gradlew streams:integration-tests:test --tests RestoreIntegrationTest

通过设置 N 重复运行特定次数的特定单元/集成测试

language 复制代码
N=500; I=0; while [ $I -lt $N ] && ./gradlew clients:test --tests RequestResponseTest --rerun --fail-fast; do (( I=$I+1 )); echo "Completed run: $I"; sleep 1;done

在单元/集成测试中运行特定测试方法

language 复制代码
./gradlew core:test --tests kafka.api.ProducerFailureHandlingTest.testCannotSendToInternalTopic
./gradlew clients:test --tests org.apache.kafka.clients.MetadataTest.testTimeToNextUpdate
./gradlew streams:integration-tests:test --tests org.apache.kafka.streams.integration.RestoreIntegrationTest.shouldRestoreNullRecord

使用 log4j 输出运行特定单元/集成测试

默认情况下,测试时只会输出少量日志。您可以通过修改模块 src/test/resources 目录中的 log4j2.yaml 文件来调整输出数量。

例如,如果您想查看更多客户端项目测试的日志,可以将 clients/src/test/resources/log4j2.yaml 中的 该行 修改为 level: INFO,然后运行:

language 复制代码
./gradlew cleanTest clients:test --tests NetworkClientTest

您应该会在 clients/build/test-results/test 目录下的文件中看到 INFO 级别的日志。

指定测试重试次数

默认情况下,重试次数是禁用的,但您可以设置 maxTestRetryFailures 和 maxTestRetries 来启用重试次数。

以下示例声明了 -PmaxTestRetries=1 和 -PmaxTestRetryFailures=3,以使失败的测试可以重试一次,总重试次数限制为 3 次。

language 复制代码
./gradlew test -PmaxTestRetries=1 -PmaxTestRetryFailures=3

有关更多详细信息,请参阅 Test Retry Gradle 插件build.yml

生成测试覆盖率报告

生成整个项目的覆盖率报告:

language 复制代码
./gradlew reportCoverage -PenableTestCoverage=true -Dorg.gradle.parallel=false

生成单个模块的覆盖率报告,例如:

language 复制代码
./gradlew clients:reportCoverage -PenableTestCoverage=true -Dorg.gradle.parallel=false

构建二进制发布 gzip 压缩包

language 复制代码
./gradlew clean releaseTarGz

发布文件位于 ./core/build/distributions/ 目录下。

构建自动生成的消息

有时,只需在分支切换时重建 RPC 自动生成的消息数据,因为它们
可能会因代码更改而失败。您只需运行以下命令:

language 复制代码
./gradlew processMessages processTestMessages

有关 Apache Kafka 消息协议的详细信息,请参阅 Apache Kafka 消息定义

运行 Kafka Broker

使用编译后的文件:

language 复制代码
KAFKA_CLUSTER_ID="$(./bin/kafka-storage.sh random-uuid)"
./bin/kafka-storage.sh format --standalone -t $KAFKA_CLUSTER_ID -c config/server.properties
./bin/kafka-server-start.sh config/server.properties

使用 Docker 镜像:

language 复制代码
docker run -p 9092:9092 apache/kafka:latest

详细信息请参阅 docker/README.md

清理构建

language 复制代码
./gradlew clean

为特定项目运行任务

这适用于 coreexamplesclients

language 复制代码
./gradlew core:jar
./gradlew core:test

Streams 有多个子项目,但您可以运行所有测试:

language 复制代码
./gradlew :streams:testAll

列出所有 gradle 任务

language 复制代码
./gradlew tasks

构建 IDE 项目

注意:开发 Kafka 时,请确保使用 JDK17。

IntelliJ 原生支持 Gradle,它会自动检查每个模块的 Java 语法和兼容性,即使
“结构 > 项目设置 > 模块”中显示的 Java 版本可能不正确。

在 Eclipse 中运行:

language 复制代码
./gradlew eclipse

“eclipse”任务已配置为使用“${project_dir}/build_eclipse”作为 Eclipse 的构建目录。Eclipse 的默认构建目录(${project_dir}/bin)与 Kafka 的脚本目录冲突,因此我们不使用 Gradle 的构建目录,以避免此配置带来的已知问题。

将 Streams Quickstart 原型项目发布到 Maven

对于 Streams 原型项目,无法使用 Gradle 上传到 Maven;而是需要在 Quickstart 文件夹中调用“mvn deploy”命令:

language 复制代码
cd streams/quickstart
mvn deploy

请注意,要使此功能正常工作,您应该创建/更新用户 Maven 设置(通常为“${USER_HOME}/.m2/settings.xml”)以分配以下变量

language 复制代码
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                           https://maven.apache.org/xsd/settings-1.0.0.xsd">
    ...                           
    <servers>
       ...
       <server>
          <id>apache.snapshots.https</id>
          <username>${maven_username}</username>
          <password>${maven_password}</password>
       </server>
       <server>
          <id>apache.releases.https</id>
          <username>${maven_username}</username>
          <password>${maven_password}</password>
        </server>
        ...
     </servers>
     ...

将所有项目安装到本地 Maven 仓库

language 复制代码
./gradlew -PskipSigning=true publishToMavenLocal

将特定项目安装到本地 Maven 仓库

language 复制代码
./gradlew -PskipSigning=true :streams:publishToMavenLocal

构建测试 jar

language 复制代码
./gradlew testJar

运行代码质量检查

我们定期运行两个代码质量分析工具:spotbugs 和 checkstyle。

Checkstyle

Checkstyle 在 Kafka 中强制执行一致的编码风格。
您可以使用以下命令运行 checkstyle:

language 复制代码
./gradlew checkstyleMain checkstyleTest spotlessCheck

Checkstyle 警告信息位于子项目构建目录中的 reports/checkstyle/reports/main.htmlreports/checkstyle/reports/test.html 文件。
这些警告信息也会打印到控制台。如果 Checkstyle 失败,构建将失败。
为了进行实验(或回归测试),请添加 -PcheckstyleVersion=X.y.z 开关(以覆盖项目定义的 Checkstyle 版本)。

Spotless

导入顺序是静态检查的一部分。请在提交拉取请求之前调用 spotlessApply 来优化 Java 代码的导入。

language 复制代码
./gradlew spotlessApply

Spotbugs

Spotbugs 使用静态分析来查找代码中的错误。
您可以使用以下命令运行 spotbugs:

language 复制代码
./gradlew spotbugsMain spotbugsTest -x test

Spotbugs 警告将在子项目构建目录中的 reports/spotbugs/main.htmlreports/spotbugs/test.html 文件中找到。
使用 -PxmlSpotBugsReport=true 可生成 XML 报告而不是 HTML 报告。

JMH 微基准测试

我们使用 JMH 编写微基准测试,以便在 JVM 中生成可靠的结果。

有关如何运行微基准测试的详细信息,请参阅 jmh-benchmarks/README.md

依赖项分析

Gradle 依赖项调试文档 提到使用 dependenciesdependencyInsight 任务来调试根项目或各个子项目的依赖项。

或者,使用 allDepsallDepInsight 任务递归迭代所有子项目:

language 复制代码
./gradlew allDeps

./gradlew allDepInsight --configuration runtimeClasspath --dependency com.fasterxml.jackson.core:jackson-databind

这些命令使用与内置变量相同的参数。

确定是否可以更新任何依赖项

language 复制代码
./gradlew dependencyUpdates

常用构建选项

以下选项应使用 -P 开关设置,例如 ./gradlew -PmaxParallelForks=1 test

  • commitId:将构建提交 ID 设置为 .git/HEAD,如果已添加用于构建的本地提交,则可能不正确。
  • mavenUrl:设置 Maven 部署仓库的 URL(可以使用 file://path/to/repo 指向本地仓库)。
  • maxParallelForks:并行启动的最大测试进程数。默认为 JVM 可用的处理器数量。
  • maxScalacThreads:scalac 后端的最大工作线程数。默认为 8 和 JVM 可用处理器数量中的最小值。
    该值必须介于 1 到 16 之间(含)。
  • ignoreFailures:忽略来自 junit 的测试失败。
  • showStandardStreams:在控制台上显示测试 JVM 的标准输出和标准错误。
  • skipSigning:跳过签名。
  • testLoggingEvents:要记录的单元测试事件,以逗号分隔。例如 ./gradlew -PtestLoggingEvents=started,passed,skipped,failed test
  • xmlSpotBugsReport:启用 XML 报告以查找错误。这也会禁用 HTML 报告,因为一次只能启用一个。
  • maxTestRetries:失败测试用例的最大重试次数。
  • maxTestRetryFailures:禁用后续测试重试之前的最大测试失败次数。
  • enableTestCoverage:启用测试覆盖率插件和任务,包括跟踪所述覆盖率所需类的字节码增强。
    请注意,这会在运行测试时带来一些开销,因此默认情况下禁用它(开销
    会有所不同,但 15-20% 是合理的估计)。
  • keepAliveMode:配置 Gradle 编译守护进程的保持活动模式 - 重用可缩短启动时间。值应为
    daemonsession(默认值为 daemon)。daemon 使守护进程保持活动状态,直到它被明确停止,而
    session 使其保持活动状态,直到构建会话结束。目前,这仅影响 Scala 编译器,请参阅
    https://github.com/gradle/gradle/pull/21034 中针对 Java 编译器尝试执行相同操作的 PR。
  • scalaOptimizerMode:配置 Scala 编译器的优化行为,其值应为 nonemethodinline-kafka
    inline-scala(默认值为 inline-kafka)。none 是 Scala 编译器的默认值,它仅会消除无法访问的代码。method
    包含方法局部优化。inline-kafka 添加了 kafka 包中方法的内联。最后,inline-scala
    包含 Scala 库中方法的内联(这避免了像 Option.exists 这样的方法的 lambda 分配)。inline-scala 仅在编译时和运行时 Scala 库版本相同的情况下才是安全的。由于我们无法保证在所有情况下都能启用此功能(例如,用户
    可能依赖于 Kafka jar 进行集成测试,而他们可能包含不同版本的 Scala 库),因此我们默认不启用此功能。
    更多详情,请参阅 https://www.lightbend.com/blog/scala-inliner-optimizer。

运行系统测试

请参阅 tests/README.md

使用 Trogdor 进行测试

我们使用 Trogdor 作为 Apache Kafka 的测试框架。您可以使用它来运行基准测试和其他工作负载。

请参阅 trogdor/README.md

在 Vagrant 中运行

请参阅 vagrant/README.md

Kafka 客户端示例

请参阅 examples/README.md

贡献

Apache Kafka 致力于建设社区;我们欢迎您提供任何想法或 补丁。您可以通过 Apache 邮件列表 联系我们。

如需贡献,请按照以下说明操作:

关于项目

Apache Kafka 是一个开源分布式事件流平台,数千家公司使用它来实现高性能数据管道、流分析、数据集成和关键任务应用程序。
Apache-2.0
Java
31,067
14720
1051
2011-08-16
2025-10-12

增长趋势 - stars