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”, notfalse. - 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=truewith no usable key material for the configured algorithm, or an algorithm outsideHS256,HS384,HS512,RS256,RS384,RS512,EdDSA,auto;QUEEN_TENANCY_HEADER=1with noQUEEN_KV_TRUSTED_PROXY=1;- a schema apply failure (unless
QUEEN_APPLY_SCHEMA=0); - failure to bind
$PORTon$QUEEN_BIND_ADDR, including aQUEEN_BIND_ADDRthat 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.