| Traveler Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Search eventually consistent catalog/rate/availability projections and return candidates. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Search 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 “One night sells out during multi-night commit” 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 Traveler Client boundary before extracting or scaling it. |
| Search Gateway | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Create an expiring quote pinned to rate, taxes, room type, and date range. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Traveler Client from also owning the contract and failure behavior of Hotel Catalog. | 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 “Channel manager sends stale inventory” to Traveler Client. | 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 Search Gateway boundary before extracting or scaling it. |
| Hotel Catalog | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Conditionally decrement every room-night row and create reservation atomically. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Search Gateway from also owning the contract and failure behavior of Rate Plan Service. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Payment succeeds after hold expiry” to Search Gateway. | 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 Hotel Catalog boundary before extracting or scaling it. |
| Rate Plan Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authorize/capture payment and confirm booking ledger; compensate on terminal failure. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Hotel Catalog from also owning the contract and failure behavior of Availability Projection. | 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 “Rate changes after quote” to Hotel Catalog. | 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 Rate Plan Service boundary before extracting or scaling it. |
| Availability Projection | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Publish channel updates and reconcile external inventory versions plus cancellations. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Rate Plan Service from also owning the contract and failure behavior of Search Index. | 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 “Cancellation races check-in” to Rate Plan 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 Availability Projection boundary before extracting or scaling it. |
| Search Index | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Search eventually consistent catalog/rate/availability projections and return candidates. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Availability Projection from also owning the contract and failure behavior of Quote Service. | 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 “One night sells out during multi-night commit” to Availability Projection. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (10M searches/s · 100K hotels · zero unauthorized oversell) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Search Index boundary before extracting or scaling it. |
| Quote Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Create an expiring quote pinned to rate, taxes, room type, and date range. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Search Index from also owning the contract and failure behavior of Reservation 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 “Channel manager sends stale inventory” to Search Index. | 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 Quote Service boundary before extracting or scaling it. |
| Reservation API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Conditionally decrement every room-night row and create reservation atomically. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Quote Service from also owning the contract and failure behavior of Room-Night Inventory. | 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 “Payment succeeds after hold expiry” to Quote Service. | 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 Reservation API boundary before extracting or scaling it. |
| Room-Night Inventory | Owns authoritative versioned state or immutable evidence. In this design it participates in: Authorize/capture payment and confirm booking ledger; compensate on terminal failure. | Defines the source of truth and commit boundary. It prevents Reservation API from also owning the contract and failure behavior of Hold Store. | 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 “Rate changes after quote” to Reservation API. | 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 Room-Night Inventory boundary before extracting or scaling it. |
| Hold Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Publish channel updates and reconcile external inventory versions plus cancellations. | Defines the source of truth and commit boundary. It prevents Room-Night Inventory from also owning the contract and failure behavior of Payment 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 “Cancellation races check-in” to Room-Night Inventory. | 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 Hold Store boundary before extracting or scaling it. |
| Payment Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Search eventually consistent catalog/rate/availability projections and return candidates. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Hold Store from also owning the contract and failure behavior of Booking 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 “One night sells out during multi-night commit” to Hold Store. | 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 Payment Service boundary before extracting or scaling it. |
| Booking Ledger | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Create an expiring quote pinned to rate, taxes, room type, and date range. | Defines the source of truth and commit boundary. It prevents Payment Service from also owning the contract and failure behavior of Channel Manager Sync. | 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 “Channel manager sends stale inventory” to Payment Service. | 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 Booking Ledger boundary before extracting or scaling it. |
| Channel Manager Sync | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Conditionally decrement every room-night row and create reservation atomically. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Booking Ledger from also owning the contract and failure behavior of Cancellation / Refund. | 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 expiry” to Booking 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 Channel Manager Sync boundary before extracting or scaling it. |
| Cancellation / Refund | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authorize/capture payment and confirm booking ledger; compensate on terminal failure. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Channel Manager Sync from also owning the contract and failure behavior of Reconciliation. | 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 “Rate changes after quote” to Channel Manager Sync. | 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 Cancellation / Refund boundary before extracting or scaling it. |
| Reconciliation | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Publish channel updates and reconcile external inventory versions plus cancellations. | Proves correctness and supports controlled recovery. It prevents Cancellation / Refund 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 “Cancellation races check-in” to Cancellation / Refund. | 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 Reconciliation boundary before extracting or scaling it. |