| Buyer Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Admit a bounded cohort from the waiting room and issue a signed queue token. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Bot Defense. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Two buyers select the same seat” to the external caller. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Buyer Client boundary before extracting or scaling it. |
| Bot Defense | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Read approximate availability, but create holds with transactional/conditional seat updates. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Buyer Client from also owning the contract and failure behavior of Virtual Waiting Room. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Payment succeeds after hold timeout” to Buyer Client. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Bot Defense boundary before extracting or scaling it. |
| Virtual Waiting Room | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Schedule hold expiry and make release idempotent against confirmation. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Bot Defense from also owning the contract and failure behavior of Catalog API. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Expiry worker races confirmation” to Bot Defense. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Virtual Waiting Room boundary before extracting or scaling it. |
| Catalog API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Authorize payment, confirm the hold, issue tickets, and append the order ledger. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Virtual Waiting Room from also owning the contract and failure behavior of Availability Cache. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Waiting-room tokens are replayed” to Virtual Waiting Room. | Costs eventual consistency, schema evolution, replay tooling, idempotent consumers, and lag operations. Earn it when bursts or downstream failure must not block acknowledgment. Measure the latency, saturation, lag, or mismatch at the Catalog API boundary before extracting or scaling it. |
| Availability Cache | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: If payment outcome is uncertain, reconcile by intent before releasing or charging again. | Removes repeated work from the latency-critical path. It prevents Catalog API from also owning the contract and failure behavior of Inventory Shard. | Read authoritative storage for every request. Simpler initially, but latency and source-of-truth load scale together and a hot key becomes a database incident. Here that simpler choice would couple “Refund and ticket scan overlap” to Catalog API. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (10M users at onsale · 100K requests/s · zero double-sells) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Availability Cache boundary before extracting or scaling it. |
| Inventory Shard | Owns authoritative versioned state or immutable evidence. In this design it participates in: Admit a bounded cohort from the waiting room and issue a signed queue token. | Defines the source of truth and commit boundary. It prevents Availability Cache from also owning the contract and failure behavior of Reservation Service. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Two buyers select the same seat” to Availability Cache. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the Inventory Shard boundary before extracting or scaling it. |
| Reservation Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Read approximate availability, but create holds with transactional/conditional seat updates. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Inventory Shard from also owning the contract and failure behavior of Hold Expiry Wheel. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Payment succeeds after hold timeout” to Inventory Shard. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Reservation Service boundary before extracting or scaling it. |
| Hold Expiry Wheel | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Schedule hold expiry and make release idempotent against confirmation. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Reservation Service from also owning the contract and failure behavior of Order Orchestrator. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Expiry worker races confirmation” to Reservation Service. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Hold Expiry Wheel boundary before extracting or scaling it. |
| Order Orchestrator | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authorize payment, confirm the hold, issue tickets, and append the order ledger. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Hold Expiry Wheel from also owning the contract and failure behavior of Payment Gateway. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Waiting-room tokens are replayed” to Hold Expiry Wheel. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Order Orchestrator boundary before extracting or scaling it. |
| Payment Gateway | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: If payment outcome is uncertain, reconcile by intent before releasing or charging again. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Order Orchestrator from also owning the contract and failure behavior of Ticket Issuer. | Put protocol, authentication, quotas, and business transitions in one process. Acceptable at low scale, but it couples external traffic risk to domain releases. Here that simpler choice would couple “Refund and ticket scan overlap” to Order Orchestrator. | Costs another hop, policy distribution, and a high-blast-radius fleet. Introduce it when many clients or services need one protocol and protection boundary. Measure the latency, saturation, lag, or mismatch at the Payment Gateway boundary before extracting or scaling it. |
| Ticket Issuer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Admit a bounded cohort from the waiting room and issue a signed queue token. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Payment Gateway from also owning the contract and failure behavior of Order Ledger. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Two buyers select the same seat” to Payment Gateway. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Ticket Issuer boundary before extracting or scaling it. |
| Order Ledger | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Read approximate availability, but create holds with transactional/conditional seat updates. | Defines the source of truth and commit boundary. It prevents Ticket Issuer from also owning the contract and failure behavior of Refund Service. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Payment succeeds after hold timeout” to Ticket Issuer. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the Order Ledger boundary before extracting or scaling it. |
| Refund Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Schedule hold expiry and make release idempotent against confirmation. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Order Ledger from also owning the contract and failure behavior of Audit / Fraud. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Expiry worker races confirmation” to Order Ledger. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Refund Service boundary before extracting or scaling it. |
| Audit / Fraud | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authorize payment, confirm the hold, issue tickets, and append the order ledger. | Proves correctness and supports controlled recovery. It prevents Refund Service from also owning the contract and failure behavior of operators and repair tooling. | Infer correctness from request logs. Logs do not prove durable business state, detect silent drift, or safely repair ambiguous outcomes. Here that simpler choice would couple “Waiting-room tokens are replayed” to Refund Service. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Audit / Fraud boundary before extracting or scaling it. |