Skip to content

Environment variables

How the broker reads configuration, which variables an operator actually touches, and every variable with the default the code applies.

Updated View as Markdown

The broker has no configuration file and no command-line flags. Every knob is an environment variable, read once by config::load() during boot, before the HTTP listener binds. There is no reload: changing a variable means restarting the process. The one argument the binary accepts is the subcommand migrate, which exists only to report that offline migration was retired and exit non-zero.

One boolean parser

Every boolean in the broker goes through the same parser, so =on, =1 and =true mean the same thing everywhere. The accepted spellings are true/false, 1/0, yes/no, on/off, case-insensitive, surrounding whitespace trimmed.

Three outcomes, and only three:

  • Recognised value: used.
  • Unset, or present but empty or whitespace-only: the documented default. JWT_ENABLED= in a Compose file means “leave it alone”, not false.
  • Anything else: a fatal boot error. The process logs FATAL: JWT_ENABLED="maybe" is not a boolean (expected true/false, 1/0, yes/no, on/off) and exits 1.

That last rule exists because the alternative failed in both directions: a strict parser with a silent fallback turned JWT_ENABLED=1 into a broker running with authentication off and nothing in the log. Booleans read outside config.rs (QUEEN_LOG_JSON, QUEEN_APPLY_SCHEMA, QUEEN_V2_BUNDLE_LOG) are validated eagerly at the same moment, so every boolean mistake in a deployment surfaces on the same boot with the same message.

Several numeric knobs are also clamped after parsing. Interval and size knobs are floored at 1, and STATS_INTERVAL_MS, RETAINED_BYTES_INTERVAL_MS and METRICS_FLUSH_MS are floored at 1000 ms: a value below the floor is raised without comment.

One clamp does comment, because the value it protects is a correctness invariant rather than a sanity floor. QUEEN_HOTLIST_RESEED_WINDOW_MS is held to at least one QUEEN_HOTLIST_RESEED_MS plus that interval’s de-phasing offset, which is the longest gap two consecutive passes of one ring can leave; below it there is a band of writes no pass ever covers. It is also held below a one-week ceiling. Either way the broker logs a boot warning naming the variable, the value you set and the value in force.

The effective configuration is printed at boot

After the JWT configuration is validated, the broker emits one boot block per subsystem (config: server, postgres, auth, sync, engine, flow, jobs, file_buffer, security, logging) carrying the values it actually resolved. A misspelled variable, a defaulted knob, or a value that came from a legacy alias is visible there instead of having to be inferred from behaviour. Read that block first when a setting appears not to have taken effect.

Secrets are masked, never printed: JWT_SECRET, PG_PASSWORD, QUEEN_ENCRYPTION_KEY and QUEEN_SYNC_SECRET render as <unset> or <set:32 chars>. That is enough to tell “I forgot to mount the secret” from “I mounted the wrong one” without putting key material into a log shipper.

What kills the boot

The broker prefers to die at startup over serving in a state you did not ask for. All five of these exit 1:

  • an unparseable boolean, as above;
  • JWT_ENABLED=true with no usable key material for the configured algorithm, or an algorithm outside HS256, HS384, HS512, RS256, RS384, RS512, EdDSA, auto;
  • QUEEN_TENANCY_HEADER=1 with no QUEEN_KV_TRUSTED_PROXY=1;
  • a schema apply failure (unless QUEEN_APPLY_SCHEMA=0);
  • failure to bind $PORT on $QUEEN_BIND_ADDR, including a QUEEN_BIND_ADDR that carries a port of its own instead of a bare host or IP.

The third is a safety interlock rather than a validation, and it is keyed on the tenancy mode alone. The tenant header is opaque and validated against nothing, so the trust boundary is the network in front of the broker. That is tolerable for queues, where an ack still has an ownership gate on an id the caller cannot guess, and it is not tolerable for key/value state, which has no opaque id at all: the only gate is the tenant in the WHERE clause, and the tenant comes from the header. Setting QUEEN_KV_TRUSTED_PROXY=1 is the operator asserting that a proxy supplies that header and strips the client’s. An interlock that defaulted to permissive would be no interlock.

The unsafe thing there is not the key/value surface, it is an opaque tenant identity that nothing validates; the KV only made it visible, by being the first surface addressable purely by name. So the requirement is unconditional: there is no flag that switches the KV off to make an unvalidated tenant header safe, and there should not be one, because a fleet where the engine is missing on some cells is worse than a boot that names the variable to set. An operator who has to take the KV down on a running cell wants the runtime kill switch instead, which is a different instrument for a different problem. See KV and timers.

One important omission from that list: a malformed QUEEN_ENCRYPTION_KEY (not 64 hex characters, or not hex) logs a single warning and disables encryption. Queues flagged encryptionEnabled then store plaintext and the pushes succeed. Grep the boot config: security block for encryption_key=<set:64 chars> before trusting at-rest encryption.

Which variables actually matter

Most of the table below is measured engine tuning that should be left alone. In practice a deployment sets variables from these groups only.

Purpose Variables
Reach PostgreSQL PG_HOST, PG_PORT, PG_USER, PG_PASSWORD, PG_DATABASE
Size the connection pool and bound statements DB_POOL_SIZE, QUEEN_STMT_TIMEOUT_MS
Move the write-admission band, or reserve pool headroom QUEEN_ADMISSION_MIN, QUEEN_ADMISSION_MAX, QUEEN_ADMISSION_POOL_RESERVE. See flow control
Re-weight which lane wakes first when the budget is exhausted QUEEN_ADMISSION_SHARE_PUSH, QUEEN_ADMISSION_SHARE_POP, QUEEN_ADMISSION_SHARE_ACK, QUEEN_ADMISSION_SHARE_MAINT
Encrypt broker-to-PostgreSQL traffic, and verify whose database answered PG_USE_SSL, PG_SSL_ROOT_CERT, PG_SSL_REJECT_UNAUTHORIZED. See PostgreSQL TLS
Serve on a different port PORT
Turn on authentication JWT_ENABLED, JWT_ALGORITHM, then JWT_SECRET or JWT_PUBLIC_KEY or JWT_JWKS_URL
Run more than one broker QUEEN_MESH_PEERS, QUEEN_MESH_PORT, QUEEN_SYNC_SECRET
Survive a database outage FILE_BUFFER_DIR (must be writable and persistent)
Change the maintenance cadence RETENTION_INTERVAL
Delete faster than one partition at a time RETENTION_PARALLELISM, raised together with QUEEN_ADMISSION_SHARE_MAINT
Put N pop claims in one transaction QUEEN_POP_FUSION
Watch, or stop, the broker sizing the pops it was asked to size QUEEN_POP_AUTOPILOT. See pop autopilot
Accept larger request bodies QUEEN_MAX_BODY_BYTES
Encrypt payloads at rest QUEEN_ENCRYPTION_KEY
Shape the logs LOG_LEVEL, QUEEN_LOG_JSON, QUEEN_LOG_RATES_MS
Let a privileged role own the DDL QUEEN_APPLY_SCHEMA
Scope queues by tenant behind a proxy QUEEN_TENANCY_HEADER. See Self-hosting
Shape the KV and timer surfaces Nothing turns them on: every broker serves them. The forty-odd QUEEN_KV_*, QUEEN_TIMERS_* and QUEEN_SWEEPER* knobs are ceilings and cadences that should be left alone, and pausing a live surface is a runtime call rather than a variable. See kv, timers and KV and timers

Two conventions in that list are worth stating explicitly.

LOG_LEVEL accepts the full EnvFilter syntax, not just a bare level: info,queen::pop=debug works. RUST_LOG takes precedence over it, and an unparseable filter falls back to info.

PG_DATABASE resolves through a non-empty chain (PG_DATABASE, then the legacy PG_DB, then postgres), so an explicitly empty value falls through. Every other string variable keeps a present-but-empty value verbatim, which is how JWT_SKIP_PATHS="" can be used to clear the default skip list.

Every accelerator has an off switch

The broker-side fast paths are all optional, and none of them is load-bearing for correctness. Each one has a kill switch that reverts to the path the broker used before that optimisation existed, so an accelerator you do not trust can be turned off in a deployment without giving up a guarantee. What you give up is throughput, and the table says how much of what.

Accelerator Variable Default What the off switch reverts to, and what it costs
Wildcard candidate hot list QUEEN_HOTLIST on The per-pop SQL candidate scan, which is the pre-hot-list path. Candidate scans reappear in the PostgreSQL profile. It also takes windowBuffer back to the SQL-only debounce, which has no early promotion, so a partition written to more often than every windowBuffer seconds stops being delivered at all. It also takes pop autopilot with it: the controller reads the ring and nothing else, so on the SQL scan an opted-in request resolves to the server-side defaults.
Windowed hot-list reseed QUEEN_HOTLIST_RESEED_FULL_MS 300000 ms 0 makes every reseed a full walk over every partition of the queue again, and switches off the repair paths that exist only because a windowed pass cannot see a cursor move.
Ack registry QUEEN_ACK_REGISTRY on, 64 MB (QUEEN_ACK_REGISTRY_MB) Every ack takes queen.log_ack_by_hash_v1 and resolves its hashes in PostgreSQL, instead of a full-batch completed ack becoming one positional cursor advance. Under the cap the registry already evicts whole entries onto that same path, so the switch only makes it unconditional.
Ack fusion QUEEN_ACK_FUSION on The synchronous queen.log_ack_at_v1 fast path, byte-identical to the pre-fusion behaviour: one commit and one fsync per ack rather than one per flush for N cursor advances.
Deduplication cache QUEEN_DEDUP_CACHE on, 512 MB (QUEEN_DEDUP_CACHE_MB) The broker always sends p_verified = -1 and SQL probes the full deduplication window on every push. Deduplication stays exact either way: the cache is a way to skip a probe, never a way to decide one.
Retention fan-out RETENTION_PARALLELISM 1 1 is already the off position, the historical serial cycle, so an upgrade changes nothing until you raise it. That serial cycle measured about 13,800 step rows per second on the 2026-08-10 rig, just under the roughly 14,600 that sustaining 1,000,000 msg/s needs, which is what raising it (ceiling 16) buys. Each worker holds one maintenance-lane admission slot and one pooled connection while it runs.
Pop fusion QUEEN_POP_FUSION off The only accelerator that ships off. Set it and N pop claim legs share one transaction and one commit, and the Pop lane takes one admission slot per fused flush instead of one per claim.
Partition cleanup QUEEN_PARTITION_CLEANUP_ENABLED on Empty partitions idle for PARTITION_CLEANUP_DAYS (30) are kept forever instead of being deleted.
Pop autopilot QUEEN_POP_AUTOPILOT on The server-side defaults for the knobs an opted-in client left out: batch 200, one partition. A client that does not send autopilot=true is unaffected in every position, so this switch is about what the controller may do, never about whether the surface exists. It is the one switch here with a third position, described below.

Pop autopilot is the one entry with three positions rather than two, and the third is the reason to reach for it. shadow computes the decision, reports it and does not apply it, so a deployment can read what the controller would have chosen for a week before letting it choose. off removes the controller outright, including its in-memory lane state and its logs. Both positions answer an opted-in request with today’s defaults and no autopilot object in the response, which is exactly what a broker older than 1.2 does, so a client needs no capability check either way.

Six constants tune the law rather than switch it. QUEEN_POP_AUTOPILOT_BATCH (100) is the batch handed to a consumer that delegated that dimension, and only to such a consumer: a client that sends its own batch is never touched by it. QUEEN_POP_AUTOPILOT_TARGET_AGE_MS (25) is the ready-age the width loop steers to. QUEEN_POP_AUTOPILOT_DWELL_MS (500) and QUEEN_POP_AUTOPILOT_DWELL_POPS (16) bound how often one (tenant, queue, group) may change its width in either direction, which is what stops the loop limit-cycling. QUEEN_POP_AUTOPILOT_MAX_LANES (50000) bounds the in-memory state on a cell with very many queues; past it the controller stops creating lanes and those lanes degrade to today’s defaults rather than a live one being evicted. QUEEN_POP_AUTOPILOT_BURST_CAP (0, disabled) lets a delegated width jump for one request to what is ready at that instant, capped, without the feedback loop losing ownership of the steady width.

Two of these are validated at boot rather than corrected. A QUEEN_POP_AUTOPILOT that is not a mode, and a QUEEN_POP_AUTOPILOT_BATCH outside its range, both kill the boot naming the value. Resolving a typo to the default silently is how a fleet ends up running on a number nobody chose.

One accelerator is absent from that table because it has no switch: push fusion has no enable flag. Cross-request push fusion is always on, and QUEEN_V2_FUSION_SHARDS (8), QUEEN_V2_FUSION_FRAMES (500) and QUEEN_V2_FUSION_HOLD_MS (3 ms) shape it rather than disable it.

The boot block prints the resolved state of most of these, so a deployment that thinks it turned one off can confirm it without inferring from throughput: config: engine carries hotlist, dedup_cache, ack_registry, ack_fusion and the reseed intervals, config: jobs carries retention_parallelism and partition_cleanup, and config: flow carries all seven pop_autopilot knobs next to the pop and admission ones. QUEEN_POP_FUSION is the exception: it prints nothing at boot in either state and has no counter of its own, so the deployment’s own environment is the only record of whether it is on.

Pop autopilot also says what it is doing while it runs, on its own autopilot log target. A rate-limited info line carries the mode, the width and batch it last chose, and running counts of requests, adjustments and live lanes, each line reporting how many it suppressed. A warn line fires once per lane, re-armed daily, when a client’s explicit width and the controller’s choice diverge widely: that one is diagnostic only, and it says so, because an explicit value is never overridden.

The variables

Defaults below are the ones the code applies, extracted from config.rs at build time. Where a variable has an alias, both names read the same setting and the newer name wins.

A handful of rows carry a derivation rather than a literal, because that is what the code applies. QUEEN_ADMISSION_INIT and QUEEN_ADMISSION_MIN come from the pool size; QUEEN_HOTLIST_RESEED_WINDOW_MS is rewritten before load() returns; QUEEN_KV_POOL_SIZE is DB_POOL_SIZE / 10 clamped to 4..32; QUEEN_KV_REQUIRE_GRANT takes the value of QUEEN_TENANCY_HEADER; and QUEEN_TIMERS_MAX_PAYLOAD_BYTES is the smaller of its own literal and the plan’s message payload ceiling, since a timer becomes a message and an independent ceiling would be a way around the plan’s. The extractor reads the call site, which for these is an expression rather than a number, so each of them is stated here with its derivation instead of published as whatever the expression happened to look like.

The broker is configured entirely through environment variables: 170 of them, listed below with the defaults the code actually applies. Booleans go through one strict parser: an unparseable value is a fatal boot error, while unset and empty both fall back to the default.

Two columns record what a variable falls back to. Also read as is an older name for the same setting: either name configures the same thing, and the row’s name wins when both are set. Default inherited from is a different knob whose value this one starts at when it is unset: setting that knob moves this variable and everything else that inherits from it, while setting this variable moves only this one.

Server

Variable Type Default Default inherited from Also read as
PORT string 6632
QUEEN_APPLY_SCHEMA boolean true
QUEEN_BIND_ADDR string 0.0.0.0
QUEEN_MAX_BODY_BYTES integer 67108864 (64 MiB)

PostgreSQL

Variable Type Default Default inherited from Also read as
DB_POOL_SIZE integer 160
PG_DATABASE string postgres PG_DB
PG_HOST string localhost
PG_PASSWORD string postgres
PG_PORT integer 5432
PG_SSL_REJECT_UNAUTHORIZED boolean true
PG_SSL_ROOT_CERT string (empty)
PG_USE_SSL boolean false
PG_USER string postgres
QUEEN_STMT_TIMEOUT_MS integer 30000

Authentication

Variable Type Default Default inherited from Also read as
JWT_ALGORITHM string HS256
JWT_AUDIENCE string (empty)
JWT_CLOCK_SKEW integer 30
JWT_ENABLED boolean false
JWT_ISSUER string (empty)
JWT_JWKS_REFRESH_INTERVAL integer 3600
JWT_JWKS_TIMEOUT_MS integer 5000
JWT_JWKS_URL string (empty)
JWT_PUBLIC_KEY string (empty)
JWT_ROLE_ADMIN string admin
JWT_ROLE_READ_ONLY string read-only
JWT_ROLE_READ_WRITE string read-write
JWT_ROLE_WRITE_ONLY string write-only
JWT_ROLES_ARRAY_CLAIM string roles
JWT_ROLES_CLAIM string role
JWT_SECRET string (empty)
JWT_SKIP_PATHS string /health,/metrics/prometheus,/metrics,/

Multi-broker mesh

Variable Type Default Default inherited from Also read as
QUEEN_CACHE_REFRESH_INTERVAL_MS integer 60000
QUEEN_MESH_ADVERTISE_HOST string (empty)
QUEEN_MESH_BIND_ADDR string 0.0.0.0 QUEEN_BIND_ADDR
QUEEN_MESH_PEERS string (empty)
QUEEN_MESH_PORT integer 6633 QUEEN_UDP_NOTIFY_PORT
QUEEN_SYNC_DEAD_THRESHOLD_MS integer 5000
QUEEN_SYNC_ENABLED boolean true
QUEEN_SYNC_HEARTBEAT_MS integer 1000
QUEEN_SYNC_SECRET string (empty)
QUEEN_UDP_NOTIFY_PORT integer 6633
QUEEN_UDP_PEERS string (empty)

Consume and long-poll

Variable Type Default Default inherited from Also read as
DEFAULT_SUBSCRIPTION_MODE string new
DEFAULT_TIMEOUT integer 30000 POP_DEFAULT_TIMEOUT_MS
POP_DEFAULT_TIMEOUT_MS integer 30000
POP_WAIT_BACKOFF_MULTIPLIER number 2.0
POP_WAIT_BACKOFF_THRESHOLD integer 3
POP_WAIT_INITIAL_INTERVAL_MS integer 100
POP_WAIT_MAX_INTERVAL_MS integer 1000
QUEEN_POP_AUTOPILOT string on
QUEEN_POP_AUTOPILOT_BATCH integer 100
QUEEN_POP_AUTOPILOT_BURST_CAP integer 0
QUEEN_POP_AUTOPILOT_DWELL_MS integer 500
QUEEN_POP_AUTOPILOT_DWELL_POPS integer 16
QUEEN_POP_AUTOPILOT_MAX_LANES integer 50_000
QUEEN_POP_AUTOPILOT_TARGET_AGE_MS number 25.0
QUEEN_POP_FUSION boolean false
QUEEN_POP_FUSION_CONCURRENCY integer 1
QUEEN_POP_FUSION_HOLD_MS integer 3
QUEEN_POP_FUSION_MAX_JOBS integer 16
QUEEN_POP_FUSION_SHARDS integer 4
QUEEN_POP_PENDING_GATE boolean true

Storage engine

Variable Type Default Default inherited from Also read as
QUEEN_ACK_FUSION boolean true
QUEEN_ACK_FUSION_HOLD_MS integer 3
QUEEN_ACK_FUSION_SHARDS integer 8 QUEEN_V2_FUSION_SHARDS
QUEEN_ACK_REGISTRY boolean true
QUEEN_ACK_REGISTRY_MB integer 64
QUEEN_DEDUP_CACHE boolean true
QUEEN_DEDUP_CACHE_MB integer 512
QUEEN_HOTLIST boolean true
QUEEN_HOTLIST_IDLE_SWEEP_MS integer 300_000
QUEEN_HOTLIST_RESEED_FULL_MS integer 300_000
QUEEN_HOTLIST_RESEED_MS integer 30000
QUEEN_HOTLIST_RESEED_WINDOW_MS integer 120000 (max of 4x QUEEN_HOTLIST_RESEED_MS and 120000)
QUEEN_HOTLIST_SHARDS integer 8 QUEEN_V2_FUSION_SHARDS
QUEEN_HOTLIST_UNSERVED_TRIM_MS integer 30_000
QUEEN_HOTLIST_WINDOW_BATCH integer 100
QUEEN_V2_FUSION_HOLD_MS integer 3
QUEEN_V2_FUSION_SHARDS integer 8
QUEEN_V2_ZSTD_LEVEL integer 3

Admission and flow control

Variable Type Default Default inherited from Also read as
QUEEN_ADMISSION_INIT integer 96 (two thirds of DB_POOL_SIZE minus QUEEN_ADMISSION_POOL_RESERVE)
QUEEN_ADMISSION_MAX integer 128
QUEEN_ADMISSION_MIN integer 96 (two thirds of DB_POOL_SIZE minus QUEEN_ADMISSION_POOL_RESERVE)
QUEEN_ADMISSION_NOSYNC_BUDGET integer 64
QUEEN_ADMISSION_POOL_RESERVE integer 16
QUEEN_ADMISSION_SHARE_ACK number 0.30
QUEEN_ADMISSION_SHARE_MAINT number 0.05
QUEEN_ADMISSION_SHARE_POP number 0.40
QUEEN_ADMISSION_SHARE_PUSH number 0.25
QUEEN_ADMISSION_TICK_MS integer 500
QUEEN_ADMISSION_TRACE boolean false
QUEEN_ADMISSION_TRAIN_GAP_US integer 300

Background jobs

Variable Type Default Default inherited from Also read as
METRICS_FLUSH_MS integer 60000
METRICS_RETENTION_DAYS integer 90
PARTITION_CLEANUP_DAYS integer 30
QUEEN_PARTITION_CLEANUP_ENABLED boolean true
RETAINED_BYTES_INTERVAL_MS integer 600000
RETENTION_BATCH_SIZE integer 1000
RETENTION_INTERVAL integer 5000
RETENTION_PARALLELISM integer 1
STATS_INTERVAL_MS integer 10000

Durability spool

Variable Type Default Default inherited from Also read as
FILE_BUFFER_DIR string /var/lib/queen/buffers
FILE_BUFFER_EVENTS_PER_FILE integer 10000
FILE_BUFFER_FLUSH_MS integer 100
FILE_BUFFER_MAX_BATCH integer 100

Security

Variable Type Default Default inherited from Also read as
QUEEN_ENCRYPTION_KEY string (empty)
QUEEN_TENANCY_HEADER boolean false

Key/value state, timers and the sweeper

Variable Type Default Default inherited from Also read as
QUEEN_KV_CELL_RATE integer 2000
QUEEN_KV_MAX_KEY_BYTES integer 512
QUEEN_KV_MAX_KEYS_PER_CALL integer 1024
QUEEN_KV_MAX_OPS_PER_CALL integer 256
QUEEN_KV_MAX_READ_BYTES integer 4 * 1024 * 1024
QUEEN_KV_MAX_TENANTS integer 10_000
QUEEN_KV_MAX_VALUE_BYTES integer 65536
QUEEN_KV_POOL_SIZE integer 16 (DB_POOL_SIZE / 10, clamped to 4..32)
QUEEN_KV_PREFIX_LIMIT integer 1000
QUEEN_KV_QUOTA_HOT_PERCENT integer 80
QUEEN_KV_QUOTA_REFRESH_MS integer 30_000
QUEEN_KV_QUOTA_RELEASE_PERCENT integer 90
QUEEN_KV_READ_BURST integer 400
QUEEN_KV_READ_RATE integer 200
QUEEN_KV_REQUIRE_GRANT boolean the value of QUEEN_TENANCY_HEADER (so: false)
QUEEN_KV_STANDALONE_SHED_AFTER integer 5
QUEEN_KV_TRUSTED_PROXY boolean false
QUEEN_KV_USAGE_EVERY_MS integer 300_000
QUEEN_KV_WRITE_BURST integer 200
QUEEN_KV_WRITE_RATE integer 100
QUEEN_SWEEPER boolean true
QUEEN_SWEEPER_BACKOFF_MAX_MS integer 60_000
QUEEN_SWEEPER_BACKOFF_MIN_MS integer 1000
QUEEN_SWEEPER_CLAIM_BATCH integer 200
QUEEN_SWEEPER_CYCLE_MAX_ROWS integer 5000
QUEEN_SWEEPER_DUE_CAP integer 2000
QUEEN_SWEEPER_FIRE_RATE_PER_TENANT integer 50
QUEEN_SWEEPER_IDLE_MAX_SLEEP_MS integer 30_000
QUEEN_SWEEPER_ISOLATE_ON_PERMANENT boolean true
QUEEN_SWEEPER_LEASE_MS integer 30_000
QUEEN_SWEEPER_MAX_ATTEMPTS integer 5
QUEEN_SWEEPER_MAX_FIRE_BYTES integer 8 * 1024 * 1024
QUEEN_SWEEPER_MAX_SLEEP_MS integer 1000
QUEEN_SWEEPER_MIN_SLEEP_MS integer 5
QUEEN_SWEEPER_PARALLELISM integer 1
QUEEN_TIMERS_MAX_HORIZON_S integer 7_776_000
QUEEN_TIMERS_MAX_OPS_PER_CALL integer 256
QUEEN_TIMERS_MAX_PAYLOAD_BYTES integer 1048576 (1 MiB), further narrowed to the plan's max_payload_bytes

Logging

Variable Type Default Default inherited from Also read as
LOG_LEVEL string info
QUEEN_LOG_JSON boolean false
QUEEN_LOG_RATES_MS integer 10000
QUEEN_LOG_TOPN_QUEUES integer 10
RUST_LOG string info LOG_LEVEL

Other

Variable Type Default Default inherited from Also read as
QUEEN_EPHEMERAL_BURST integer 10_000
QUEEN_EPHEMERAL_IMPLICIT_IDLE_S integer 300
QUEEN_EPHEMERAL_LEASE_S integer 30
QUEEN_EPHEMERAL_MAX_BYTES integer 256 * 1024 * 1024
QUEEN_EPHEMERAL_QUEUE_MAX_BYTES integer 16 * 1024 * 1024
QUEEN_EPHEMERAL_QUEUE_MAX_LENGTH integer 10_000
QUEEN_EPHEMERAL_RATE integer 5000
QUEEN_EPHEMERAL_REQUIRE_GRANT boolean tenancy_header
QUEEN_EPHEMERAL_RETRY_LIMIT integer 5
QUEEN_KAFKA_BIN string (empty)
QUEEN_KAFKA_EMBEDDED boolean false
QUEEN_KAFKA_SHUTDOWN_GRACE_MS integer 5000
QUEEN_RETENTION_DUE_CAP integer 0
QUEEN_RETENTION_SAFETY_WALK_MS integer 86_400_000
QUEEN_S3_BIN string (empty)
QUEEN_S3_EMBEDDED boolean false
QUEEN_S3_SHUTDOWN_GRACE_MS integer 30000
QUEEN_SQS_BIN string (empty)
QUEEN_SQS_EMBEDDED boolean false
QUEEN_SQS_SHUTDOWN_GRACE_MS integer 5000

Experiment-only

These exist to run experiments against the storage engine. The source marks them as such, they are not part of any compatibility promise, and a deployment should not set them.

Variable Default Why it is not a product knob
QUEEN_V2_BUNDLE_MAX see notes fusion.rs: internal override only
QUEEN_V2_FUSION_MAX_INFLIGHT see notes fusion.rs: internal override only
QUEEN_V2_FUSION_MIN_FRAMES see notes fusion.rs: “a knob for experiments, not a product contract”
QUEEN_V2_FUSION_MIN_WAIT_MS see notes fusion.rs: “a knob for experiments, not a product contract”

Read but inert

The broker still parses these and still prints them in its boot configuration block, so they look live in a log. They change nothing.

Variable Default Status
QUEEN_V2_FUSION_FRAMES 500 kept for env compatibility; no longer a flush trigger (fusion.rs)

Node identity

One variable does not appear in the table because it is not read through the same helper: QUEEN_SERVER_ID names this instance in mesh heartbeats and peer stats. Unset, the broker uses HOSTNAME; with neither, it generates queen-<8 hex>. The value is cosmetic (nothing routes on it), but it is what makes a peer list readable in the config: sync boot block.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close