Stability Policy¶
Where rabbitkit actually is (as of 0.11.0)¶
rabbitkit is at 0.11.0; 0.9.0 was the first published release
(public beta).
Development happened privately under internal milestone numbers — now the
0.8.x entries in CHANGELOG.md (each marked with its former number);
none were ever distributed, and the history was renumbered at publication
so the version signals beta maturity honestly.
What that number means in practice:
- Stable Core (below) has been through multiple structured
production-readiness passes (see the
0.8.xentries inCHANGELOG.mdfor the fix record) and is treated as frozen: breaking it requires the deprecation cycle described in this document, even before1.0.0. - Advanced Stable and Experimental are explicitly not covered by that freeze — see their sections below for what guarantee (if any) each gets.
1.0.0is reserved for the release where Stable Core's freeze graduates from policy to full SemVer guarantee. A later major is reserved for the point where all three tiers are simultaneously under full SemVer, if and when Advanced Stable and Experimental features individually earn it (see "Promotion criteria" below). Until then, treat the tier a symbol is in as the actual guarantee — not the version number alone.
Stable Core¶
The following symbols will not be removed or changed in a backward-incompatible way without a deprecation cycle (minimum one minor version of warning, per the Deprecation Policy below). This is the small, deliberately-limited set the README teaches — if you only use these, you're on the most-supported path.
| Symbol | Module |
|---|---|
RabbitConfig, ConnectionConfig, ConsumerConfig, PublisherConfig, RetryConfig, SecurityConfig, SSLConfig, SocketConfig, WorkerConfig, PoolConfig, HealthCheckConfig |
rabbitkit |
AsyncBroker, SyncBroker |
rabbitkit |
RabbitRouter, subscriber, publisher |
rabbitkit |
RabbitMessage, MessageEnvelope, AckMessage, NackMessage, RejectMessage |
rabbitkit |
AckPolicy, TopologyMode |
rabbitkit |
RabbitQueue, RabbitExchange |
rabbitkit |
RabbitApp |
rabbitkit |
rabbitkit_lifespan (FastAPI integration) |
rabbitkit |
Depends, Header, Path, Context |
rabbitkit |
TestBroker, TestApp |
rabbitkit.testing |
Exception taxonomy: ConfigurationError, ConfigValidationError, TopologyValidationError, UnsafeTopologyError, MessageTooLargeError, BrokerNotStartedError, SettlementError, DuplicateRouteError, MissingDependencyError, BackpressureError, PublishError — including their builtin base classes (ValueError/RuntimeError dual inheritance is part of the contract, not an implementation detail) |
rabbitkit |
broker_health_check, broker_health_check_async, broker_liveness, broker_liveness_async, broker_readiness, broker_readiness_async |
rabbitkit |
LoggingConfig, configure_structlog |
rabbitkit |
| Built-in serializers: JSON, msgspec, Pydantic support | rabbitkit.serialization.* |
| Always-on middlewares: retry, deduplication, timeout, compression, metrics, rate limiting | rabbitkit.middleware.* |
Stable means:
- The symbol exists at the listed import path.
- The constructor/call signature does not gain required parameters.
- Existing keyword arguments are not removed or renamed.
- Return types do not change in a breaking way.
- Sync and async twins (
SyncBroker/AsyncBroker, etc.) expose the same public method names and semantics — checked by a dedicated parity test in the test suite, not just convention.
Advanced Stable¶
Real, production-grade, tested — but adds real complexity, may depend on an external package outside the core install, or is used deliberately rather than by default. Breaking changes here get a deprecation cycle like Stable Core, but the bar for introducing new complexity to this tier is lower, and it is not part of the "understand rabbitkit in 10 minutes" story.
| Feature | Import path | Notes |
|---|---|---|
Publish-side backpressure (FlowController, BackpressureConfig) |
rabbitkit / rabbitkit.highload.backpressure |
|
Batch publishing/acking (BatchPublisher, BatchAcker, AsyncBatchPublisher) |
rabbitkit / rabbitkit.highload.batch / rabbitkit.async_.batch |
Buffering/timing amortization, not wire-level batching — see the high-load guide. |
DLQ inspection (DLQInspector) + the CLI's dlq commands |
rabbitkit |
|
RabbitMQ Management API client (RabbitManagementClient) |
rabbitkit |
Async methods require rabbitkit[management] (aiohttp). |
CLI (rabbitkit run/health/topology/routes/shell) |
rabbitkit[cli] |
|
CircuitBreakerMiddleware |
rabbitkit |
Requires a CircuitBreakerProtocol-compatible implementation (e.g. pybreaker) to do anything — it's a no-op passthrough without one. Exported at the top level for convenience, but treat the dependency as a real one before adopting it. |
Experimental¶
The following features live under rabbitkit.experimental (or emit a clear
signal when imported from elsewhere). They may change or be removed without
a deprecation cycle, in any release. Do not depend on them in production
unless you're prepared to track changes closely.
| Feature | Import path | Why it's experimental |
|---|---|---|
| RPC (request/reply) | rabbitkit.experimental (RPCClient, AsyncRPCClient) |
RPC-over-direct-reply-to has real documented sharp edges: handler exceptions don't propagate as clean RPC errors by default, and the reply-size cap is enforced only after the full reply is buffered. Treat as an escape hatch, not a recommended architecture. |
Distributed locking (DistributedLock, RedisLock, LockMiddleware) |
rabbitkit.experimental |
RedisLock has no TTL auto-renewal — a slow handler can lose the lock mid-work. See the locking guide before using this for anything correctness-critical. |
Message signing (SigningMiddleware) |
rabbitkit.experimental |
The default nonce cache is per-process/in-memory — replay protection is not real across multiple workers/pods without explicitly wiring a shared (Redis) cache. |
Result backends (ResultBackend, RedisResultBackend, ResultMiddleware) |
rabbitkit.experimental |
This is task-queue-style result correlation, which is deliberately out of scope for a RabbitMQ-first toolkit — see the comparison doc for why rabbitkit doesn't try to be Celery. Use with that tradeoff in mind. |
Stream queues (StreamOffset, StreamConsumerConfig) |
rabbitkit.experimental |
Smaller audience, different protocol semantics than classic/quorum queues. |
Dashboard (create_dashboard_app) |
rabbitkit.experimental |
Unauthenticated by default. Never bind it to a non-loopback interface without auth_token= and a reverse proxy. |
Experimental APIs:
- May change signatures between patch releases.
- May be removed if the design proves unworkable.
- Are not covered by the deprecation policy below.
Feedback on experimental APIs is welcome and actively used to determine whether they graduate — see the promotion criteria below.
Promotion criteria (Experimental → Advanced Stable / Stable Core)¶
An experimental feature does not graduate because it's popular. It graduates when it has demonstrably earned the tier above it:
- At least 2 minor releases with no breaking changes to its public shape.
- A dedicated production-readiness pass — the kind of structured,
adversarial review this project already runs internally before shipping
fixes (see the
CHANGELOG.mdfix history for the standard of evidence expected: root cause, fix, regression test, verified-by-reverting). - A security review, if the feature touches authentication, secrets, or untrusted input (signing and the dashboard both qualify).
- No open, known-dangerous default — e.g. signing cannot graduate while its default nonce cache is silently unsafe across multiple workers; that has to become a loud, unmissable warning or a safer default first.
Absent all of the above, a feature stays experimental regardless of how long it's existed or how many users depend on it.
Deprecation Policy¶
For Stable Core (and Advanced Stable) APIs:
- A deprecation warning (
DeprecationWarning) is emitted for at least one minor release before removal. - The
CHANGELOG.mdentry for the deprecating release documents the replacement. - The symbol is removed in the following minor release at the earliest.
Worked example: rabbitkit.aio was deprecated in favor of the canonical
rabbitkit.async_ import path pre-publication (internal 0.8.1) — it
still works, but importing it
emits a DeprecationWarning pointing at the replacement. It will be removed
no earlier than the next minor release. This is the policy in practice, not
just in theory.
For Experimental APIs, no deprecation cycle is guaranteed. Changes are noted
in CHANGELOG.md but may take effect in the same release that introduces
them.
How to Track Changes¶
CHANGELOG.mdin the repository root is the authoritative record of changes per release.- The
[Unreleased]section shows what is planned or in progress for the next release. - Breaking changes are marked with
**Breaking**in the changelog entry. - This document is reviewed for accuracy at every release — see the release
checklist in
CONTRIBUTING.md.