mirror of https://github.com/apache/kafka.git
37 lines
3.0 KiB
Markdown
37 lines
3.0 KiB
Markdown
# GraalVM Based Native Apache Kafka Docker Image
|
|
|
|
## Introduction
|
|
- The Native Apache Kafka Docker Image can launch brokers with sub-second startup time and minimal memory footprint by leveraging native Kafka executable.
|
|
- The native Kafka executable is built by compiling Apache Kafka code ahead-of-time using the [GraalVM native-image tool](https://www.graalvm.org/jdk21/reference-manual/native-image/).
|
|
- This image is experimental and intended for local development and testing purposes only; it is not recommended for production use.
|
|
- This is introduced with [KIP-974](https://cwiki.apache.org/confluence/x/KZizDw).
|
|
|
|
## Native-Image reachability metadata
|
|
The native-image tool performs static analysis while building a native binary to determine the dynamic features(the dynamic language features of the JVM, including reflection and resource handling, compute the dynamically-accessed program elements such as invoked methods or resource URLs at runtime), but it cannot always exhaustively predict all uses.
|
|
To ensure inclusion of these elements into the native binary, reachability metadata should be provided to the native-image builder.
|
|
These metadata configs are provided in the `native-image-configs` directory.
|
|
|
|
## How to generate reachability metadata
|
|
GraalVM provide an option to create these configs automatically by running the application normally with the [native-image agent](https://www.graalvm.org/latest/reference-manual/native-image/metadata/AutomaticMetadataCollection/) attached.
|
|
The configs in the `native-image-configs` directory are generated by running existing Apache Kafka System Tests(using GraalVM JIT and attaching the native-image agent to the process) as they are quite exhaustive.
|
|
|
|
To update reachability metadata, users can set following environment variable and run related jar files. New metadata configs will be generated in the `native-image-configs` directory.
|
|
```bash
|
|
export JAVA_TOOL_OPTIONS="-agentlib:native-image-agent=config-merge-dir=/path/to/kafka/docker/native/native-image-configs"
|
|
```
|
|
|
|
## Limitations of Native Apache Kafka executable
|
|
- Dynamic Features: For any new dynamic feature added or modified in Apache Kafka, the corresponding metadata configurations must be added or updated in the `native-image-configs`. As of now these configs are static.
|
|
- Runtime Jars: Native Kafka Executable does not support capabilities that require a new runtime jar provided by the user, as the jar's information is not available during build time. In such cases, a new native Kafka binary must be built, including that jar in the classpath during the build.
|
|
- Garbage Collection: This implementation uses the community edition of GraalVM, which supports only `serial` GC. Therefore, Native Apache Kafka supports `serial` GC and not `G1` GC.
|
|
|
|
## How to use this image in docker container
|
|
Check out [this](../examples/README.md) guide.
|
|
|
|
## How to build, test and release this docker image
|
|
Check out [this](../README.md) guide.
|
|
|
|
## How to run system tests on native Apache Kafka
|
|
Check out [this](../../tests/README.md#running-tests-using-docker) guide.
|
|
|