This version is still in development and is not considered stable yet. For the latest stable version, please use Korvet 0.12.5!

Configuration Reference

Complete configuration reference for Korvet.

Configuration Properties

Broker Configuration

Property Default Description

korvet.broker.host

0.0.0.0

Host address to bind the server

korvet.broker.port

9092

Port to listen on

korvet.broker.broker-id

0

Broker ID for this server

korvet.broker.keyspace

korvet

Redis keyspace prefix for broker metadata, topic registry, and committed offsets

korvet.broker.advertised-host

host

Advertised host for clients (if not set, uses host)

korvet.broker.advertised-port

port

Advertised port for clients (if not set, uses port)

korvet.broker.boss-threads

1

Netty boss thread pool size

korvet.broker.worker-threads

0

Netty worker thread pool size (0 = 2 × CPU cores)

korvet.broker.max-request-size

100MB

Maximum request size

korvet.broker.partition-max-bytes

1MB

Maximum bytes per partition in fetch requests

korvet.broker.fetch-max-wait

500ms

Maximum time to wait for fetch requests

korvet.broker.sasl.enabled

false

Enable SASL authentication for the Kafka protocol listener using Redis-backed credentials in the broker keyspace

korvet.topics.auto-create

false

Automatically create topics when they don’t exist

korvet.topics.partitions

1

Default partitions for auto-created topics

korvet.topics.offset-sequence-bits

10

Bits for sequence number in offset encoding (1-16)

korvet.topics.average-message-bytes

0

Average message size estimate used when translating byte-based retention into message-count trimming. 0 means fall back to the built-in mapper default.

korvet.topics.retention-time

7d

Default time-based retention for topics

korvet.topics.retention-bytes

-1

Default size-based retention (-1 = unlimited)

korvet.topics.compression

none

Default compression type (none, gzip, snappy, lz4, zstd)

korvet.topics.storage-compression

lz4

Default compression for values at rest in Redis

korvet.topics.value-type

auto

Default value storage strategy (auto, json, raw)

korvet.topics.remote-storage-enabled

false

Enable remote/tiered storage by default for newly created topics

korvet.topics.local-retention-time

inherit

Default local-tier retention time. If unset, inherits from retention-time

korvet.topics.local-retention-bytes

-2

Default local-tier retention size. -2 inherits from retention-bytes

korvet.topics.bucket-duration

none

Default bucket duration for newly created topics. When unset, topics are unbucketed unless configured explicitly.

korvet.broker.rebalance-delay

3s

Delay before completing consumer group rebalance

korvet.broker.max-pending-bytes

100MB

Maximum pending bytes before applying backpressure to producers

korvet.broker.resume-pending-bytes

50MB

Threshold for resuming reads after backpressure (should be < max-pending-bytes)

Runtime Services

Property Default Description

korvet.services

broker,archiver

Comma-separated list of services this process should run. Supported values are broker and archiver. When archiver is requested without korvet.storage.remote.path, Korvet skips that service if broker is also requested, and fails startup if a remote-storage-only service is the only requested service.

TLS Configuration

Property Default Description

korvet.broker.tls

false

Enable TLS for the Kafka protocol endpoint

korvet.broker.cert-file

none

Server certificate file (PEM format)

korvet.broker.key-file

none

Server private key file (PEM format)

korvet.broker.key-password

none

Password for the private key file

korvet.broker.trust-cert-file

none

Trusted CA certificates file (PEM format)

korvet.broker.client-auth-required

false

Require client certificate authentication

Redis Configuration

Property Default Description

korvet.redis.uri

none

Redis connection URI (e.g., redis://localhost:6379)

korvet.redis.host

localhost

Redis host (used if URI not set)

korvet.redis.port

6379

Redis port (used if URI not set)

korvet.redis.username

none

Redis username

korvet.redis.password

none

Redis password

korvet.redis.cluster

false

Enable Redis Cluster mode

korvet.redis.timeout

none

Connection timeout

korvet.redis.pool.size

8

Connection pool size for Redis committed-offset operations

korvet.redis.pool.max-wait

10s

Maximum time to wait for a connection when pool is exhausted. When the pool is full, requests will wait up to this duration before timing out. Supports duration formats like 5s, 30s, 1m.

korvet.redis.io-thread-pool-size

CPU cores

Lettuce I/O thread pool size

Local Storage Configuration

Property Default Description

korvet.storage.local.redis.uri

inherits `korvet.redis.uri`

Optional Redis URI override for hot storage

korvet.storage.local.redis.host

localhost

Optional Redis host override for hot storage

korvet.storage.local.redis.port

6379

Optional Redis port override for hot storage

korvet.storage.local.redis.username

inherits `korvet.redis.username`

Optional Redis username override for hot storage

korvet.storage.local.redis.password

inherits `korvet.redis.password`

Optional Redis password override for hot storage

korvet.storage.local.redis.cluster

false

Optional Redis Cluster mode override for hot storage

korvet.storage.local.redis.timeout

inherits `korvet.redis.timeout`

Optional Redis timeout override for hot storage

korvet.storage.local.redis.io-thread-pool-size

inherits `korvet.redis.io-thread-pool-size`

Optional Lettuce I/O thread pool override for hot storage

korvet.storage.local.keyspace

korvet:storage:local

Redis keyspace prefix for hot-tier metadata and coordination

korvet.storage.local.redis.pool.size

8

Connection pool size shared by hot-stream and storage-metadata operations

korvet.storage.local.redis.pool.max-wait

10s

Maximum acquisition wait for the shared hot-storage pool

korvet.storage.local.redis.circuit-breaker.enabled

true

Enable fail-fast protection for hot-tier writes after Redis reports max-memory OOM errors

korvet.storage.local.redis.circuit-breaker.open-duration

30s

How long hot-tier writes fail fast after a Redis max-memory OOM trips the breaker

korvet.storage.local.redis.circuit-breaker.log-interval

30s

Maximum frequency for repeated "breaker still open" write rejection logs

korvet.redis.circuit-breaker.*

shared fallback

Optional shared fallback for the local-storage circuit breaker when korvet.storage.local.redis.circuit-breaker.* is unset

Remote Storage Configuration

Property Default Description

korvet.storage.remote.keyspace

korvet:storage:remote

Redis keyspace prefix for remote-tier metadata and Delta coordination

Redis Metrics Configuration

Property Default Description

korvet.redis.metrics.enabled

false

Enable Lettuce command latency metrics

korvet.redis.metrics.histogram

false

Enable histogram buckets for percentiles

korvet.redis.metrics.local-distinction

false

Track metrics per connection vs per host

korvet.redis.metrics.max-latency

5m

Maximum expected latency for histograms

korvet.redis.metrics.min-latency

1ms

Minimum expected latency for histograms

Storage Configuration

Remote Tier

Cold storage is enabled automatically when korvet.storage.remote.path is configured.

Property Default Description

korvet.storage.remote.path

none

Cold storage base path (e.g., s3a://bucket/path or file:///tmp/cold). Setting this enables cold storage.

korvet.storage.remote.s3.region

none

AWS region (required for S3)

korvet.storage.remote.s3.endpoint

none

Custom S3 endpoint (for MinIO or LocalStack)

korvet.storage.remote.s3.credentials.type

auto

Credential type: auto, iam, irsa, or static

korvet.archiver.batch-size

100000

Maximum records written per archive write

korvet.archiver.max-unarchived-age

5m

Archive a stream once its oldest unarchived message reaches this age

korvet.archiver.scan-interval

5s

How often the planner scans Redis streams for archival work

korvet.archiver.pending-idle-time

5m

How long a claimed pending archival entry may remain idle before the archiver tries to reclaim it

korvet.archiver.max-concurrent-streams

1

Maximum number of streams this process archives concurrently

korvet.storage.remote.writer.messages-per-file

100000

Maximum records written into a single Parquet file before the writer rolls over

korvet.storage.remote.writer.target-file-size-bytes

134217728

Target payload budget for each Parquet file so cold storage defaults avoid undersized files

See Cold Storage Configuration for complete configuration details and S3 performance tuning.

Default Configuration

The following shows the default application.yml configuration file:

Unresolved include directive in modules/ROOT/pages/reference/configuration.adoc - include::../../examples/application.yml[]

Environment Variables

All configuration can be set via environment variables using Spring Boot’s relaxed binding:

# Broker Configuration
export KORVET_BROKER_HOST=0.0.0.0
export KORVET_BROKER_PORT=9092
export KORVET_BROKER_BROKER_ID=0
export KORVET_BROKER_KEYSPACE=korvet
export KORVET_BROKER_ADVERTISED_HOST=localhost
export KORVET_BROKER_ADVERTISED_PORT=9092

# Thread pool configuration
export KORVET_BROKER_BOSS_THREADS=1
export KORVET_BROKER_WORKER_THREADS=0  # 0 = use Netty default (2 * CPU cores)

# Request size limits
export KORVET_BROKER_MAX_REQUEST_SIZE=100MB
export KORVET_BROKER_PARTITION_MAX_BYTES=1MB

# Fetch Configuration
export KORVET_BROKER_FETCH_MAX_WAIT=500ms  # Maximum time to wait for fetch requests when no data is available

# Offset Encoding
# Number of bits for sequence number in offset encoding (1-16)
# Default: 10 (supports up to ~1 million messages/second per partition)
# See xref:quick-start/configuration.adoc#_offset_encoding_configuration[Offset Encoding Configuration] for details
export KORVET_TOPICS_DEFAULTS_OFFSET_SEQUENCE_BITS=10

# Topic Configuration
export KORVET_TOPICS_AUTO_CREATE=true
export KORVET_TOPICS_DEFAULTS_PARTITIONS=1
export KORVET_TOPICS_DEFAULTS_RETENTION_TIME=7d
export KORVET_TOPICS_DEFAULTS_RETENTION_BYTES=-1  # -1 = unlimited
export KORVET_TOPICS_DEFAULTS_COMPRESSION=none  # none, gzip, snappy, lz4, zstd
export KORVET_TOPICS_DEFAULTS_STORAGE_COMPRESSION=lz4
export KORVET_TOPICS_DEFAULTS_VALUE_TYPE=auto
export KORVET_TOPICS_DEFAULTS_REMOTE_STORAGE_ENABLED=false

# Consumer Group Configuration
export KORVET_BROKER_REBALANCE_DELAY=3s  # Delay before completing rebalance (default: 3s)

# Runtime services (optional)
# Defaults to broker,archiver. Without korvet.storage.remote.path, archiver is skipped.
export KORVET_SERVICES=broker,archiver

# Backpressure Configuration
export KORVET_BROKER_MAX_PENDING_BYTES=100MB  # Max pending bytes before backpressure (default: 100MB)
export KORVET_BROKER_RESUME_PENDING_BYTES=50MB  # Resume threshold after backpressure (default: 50MB)

# TLS Configuration (optional)
export KORVET_BROKER_TLS=true
export KORVET_BROKER_CERT_FILE=/path/to/server.crt
export KORVET_BROKER_KEY_FILE=/path/to/server.key
export KORVET_BROKER_KEY_PASSWORD=secret
export KORVET_BROKER_TRUST_CERT_FILE=/path/to/ca.crt
export KORVET_BROKER_CLIENT_AUTH_REQUIRED=false

# Redis Connection
export KORVET_REDIS_URI=redis://localhost:6379
export KORVET_REDIS_HOST=localhost
export KORVET_REDIS_PORT=6379
export KORVET_REDIS_USERNAME=default
export KORVET_REDIS_PASSWORD=secret
export KORVET_REDIS_CLUSTER=false
export KORVET_REDIS_TIMEOUT=5s  # Connection timeout (optional)
export KORVET_REDIS_POOL_SIZE=8  # Connection pool size (default: 8)
export KORVET_REDIS_IO_THREAD_POOL_SIZE=4  # Lettuce I/O thread pool size (default: number of CPUs)

# Redis Metrics (optional)
# Enables Lettuce command latency metrics published to Micrometer
export KORVET_REDIS_METRICS_ENABLED=false  # Default: false
export KORVET_REDIS_METRICS_HISTOGRAM=false  # Default: false
export KORVET_REDIS_METRICS_LOCAL_DISTINCTION=false  # Default: false
export KORVET_REDIS_METRICS_MAX_LATENCY=5m  # Default: 5m
export KORVET_REDIS_METRICS_MIN_LATENCY=1ms  # Default: 1ms

# Remote Storage (optional) - enabled when path is set
export KORVET_STORAGE_REMOTE_PATH=s3a://my-bucket/korvet/delta
export KORVET_STORAGE_REMOTE_S3_REGION=us-east-1
export KORVET_STORAGE_REMOTE_S3_ENDPOINT=http://localhost:4566  # Optional: for LocalStack/MinIO
export KORVET_STORAGE_REMOTE_S3_CREDENTIALS_TYPE=iam  # or 'static'
export KORVET_STORAGE_REMOTE_S3_CREDENTIALS_ROLE_ARN=arn:aws:iam::123456789012:role/KorvetReaderRole
# For static credentials:
export KORVET_STORAGE_REMOTE_S3_CREDENTIALS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export KORVET_STORAGE_REMOTE_S3_CREDENTIALS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

# S3 Performance Tuning (optional)
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_MAX_CONNECTIONS=96  # Default: 96
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_MAX_THREADS=64  # Default: 64
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_READAHEAD_RANGE=256K  # Default: 256K
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_INPUT_POLICY=normal  # normal, sequential, random
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_FAST_UPLOAD=true  # Default: true
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_FAST_UPLOAD_BUFFER=disk  # disk, bytebuffer, array
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_FAST_UPLOAD_ACTIVE_BLOCKS=8  # Default: 8
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_BLOCK_SIZE=64M  # Default: 64M
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_MULTIPART_SIZE=64M  # Default: 64M
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_CONNECTION_TIMEOUT=15000  # ms, Default: 15000
export KORVET_STORAGE_REMOTE_S3_PERFORMANCE_SOCKET_TIMEOUT=60000  # ms, Default: 60000

# Cold tier archiver configuration (optional, used when storage path is set)
export KORVET_ARCHIVER_BATCH_SIZE=100000  # Default: 100000
export KORVET_ARCHIVER_LAG_MESSAGES_THRESHOLD=100000  # Default: 100000
export KORVET_ARCHIVER_LAG_DURATION_THRESHOLD=5m  # Default: 5m
export KORVET_ARCHIVER_INTERVAL=5s  # Default: 5s
export KORVET_ARCHIVER_WORKERS=1  # Default: 1
export KORVET_ARCHIVER_FILES_PER_COMMIT=10  # Default: 10

# Logging
export LOGGING_LEVEL_COM_REDIS_KORVET=INFO