The backbone is whatever carries messages between the systems in the reference architecture. The general broker comparisons live in the data-engineering cluster (RabbitMqVsKafka, KafkaAlternativesCompared, NatsAndJetStream); this page is the commerce-specific decision: which fabric, at which tier, with which boundaries synchronous.
At garage tier the correct backbone is often no broker at all: polling loops on a schedule, reading state via API and writing deltas. Polling is self-healing (a missed cycle is caught by the next), trivially debuggable, and idempotent by construction if consumers follow the set-don't-increment rule. Its cost is latency — minutes, not milliseconds — which maps directly onto the oversell window (DataConsistencyAndSyncPatterns). Graduate individual flows to events when that flow's latency costs money, not wholesale.
Postgres-as-queue deserves honorable mention: SELECT … FOR UPDATE SKIP LOCKED on a jobs table is a real queue with ACID semantics, zero new infrastructure, and full SQL observability. For a garage-to-early-growth stack already centered on one Postgres, it beats introducing a broker — its ceiling is throughput and fan-out, and reaching that ceiling is a good problem.
The commerce rule of thumb: synchronous where a human is waiting and the answer changes what they see; asynchronous everywhere else.
| Interaction | Mode | Why |
|---|---|---|
| Checkout → payment authorization | Sync | Customer is watching; failure must surface now |
| Checkout → tax/shipping quote | Sync (cached) | Same, but cacheable and degradable |
| Order → fulfillment release | Async | Nobody is waiting; reliability beats latency |
| WMS → storefront stock sync | Async | Continuous loop; latency = oversell window |
| Shipment → customer notification | Async | Obviously |
| Anything → ERP financial postings | Async (batched ok) | Finance cares about completeness, not seconds |
Two hard-won corollaries. Never put a broker inside a synchronous user path — request-reply over messaging adds failure modes without adding value (IntegrationPatternVocabulary). And every sync call needs a degradation story (timeout, retry budget, fallback), because the checkout path inherits the availability of everything it calls synchronously — which is the strongest argument for keeping that list short.
Separate concern from the broker: the gateway fronts your synchronous APIs (storefront APIs, partner/3PL APIs, webhooks in) with auth, rate limiting, and routing. Open-source default picks: Kong or Apache APISIX (both OSS cores; watch the open-core edges), or plain Traefik/nginx at garage tier where "gateway" means TLS + routing. A gateway is Tier 2+ equipment; a garage stack exposing one storefront API needs a reverse proxy, not a product.
The failure mode that killed the ESB — business logic migrating into the middleware until the pipe is an unversioned, untestable application — recurs today inside iPaaS tools and broker plugins. The guard: the backbone carries and routes; it does not decide. Translation, enrichment, and routing rules live in owned, versioned, testable services at the edges (IntegrationMiddlewareAndTooling); the broker config stays boring enough to recreate from a README.
| Tier | Backbone |
|---|---|
| Garage | Cron + APIs; Postgres jobs table where queueing is needed |
| Growth | RabbitMQ (or NATS for the one-fabric self-host aesthetic) + outbox |
| Enterprise | Kafka/Redpanda event log + CDC; RabbitMQ retained for work queues; gateway at the edge |