Skip to content

epic(distributed): shared backends and standalone workers for multi-node deployments #613

Description

@EricAndrechek

Area: mq / cache / dedupe / ingest / app — distributed deployment epic · scoped with @EricAndrechek, 2026-09-24

#583 makes one process serve many tenants. This epic makes many processes serve them: every stateful layer that is embedded today gets a shared, external implementation, the background loops can run outside the API process, and a deployment chooses the implementation of each layer at boot. The embedded implementations stay the default, so a standalone operator notices no change. The work is being built alongside #583 and ships after it.

Decisions (2026-09-24)

  • Implementations are chosen per process, not per tenant. The boot config (config.yaml / WH_*) picks each layer's implementation; a tenant's config.json keeps only its own tunables (budgets, TTLs, enabled switches).
  • External NATS: WaveHouse does not own the streams. A NATS Kubernetes operator creates and owns the streams, consumers and policies, shared across tenants rather than one set per tenant. WaveHouse checks at boot that they exist and never creates or edits them. The embedded implementation keeps its per-tenant streams (feat(mq): give every tenant a queue of its own #612).
  • Remote dedupe stays pluggable. Whether a tenant is pinned to a home region or must be deduplicated globally is undecided. DynamoDB in one region is built first; the multi-region-strong-consistency and Scylla paths are designed and documented.
  • Each workstream is a draft PR, stacked where one depends on another. Nothing merges before epic(settings): multi-tenant settings directory and tenant-scoped runtime #583 is done.

Workstreams

PRs (all merged to main by 2026-09-30)

Every stack was squash-merged to main, children collapsed into their roots: #647, #632, #616, #655, #619 (with #627), #618, #615, #622, #623, #614 (E stack), #625 (F stack), and #624 (the whole D stack plus B2: #636, #639, #644, #646, and the fix rounds #695/#696).

Related: #583, #612, #246, #247, #264, #384, #390, #393, #403, #271, #220, #222.

Status (2026-09-30)

Done: every workstream is on main; the last, D with B2, landed in #624. The embedded backends remain the default. Before production traffic relies on external NATS, the 3-node checks in #694 should run.

Follow-ups, each tracked on its own:

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions