| Mobile / Web | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authenticate the socket and resolve its gateway in the session directory. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Anycast Edge. | 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 “Gateway dies after log append before acknowledgment” 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 Mobile / Web boundary before extracting or scaling it. |
| Anycast Edge | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Route a send to the conversation partition and recheck membership version. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Mobile / Web from also owning the contract and failure behavior of WebSocket Gateway. | 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 “Large group fan-out overwhelms online delivery” to Mobile / Web. | 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 Anycast Edge boundary before extracting or scaling it. |
| WebSocket Gateway | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Deduplicate client_msg_id, assign the next partition sequence, and durably append. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Anycast Edge from also owning the contract and failure behavior of Session Directory. | 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 “Membership revoked during an in-flight send” to Anycast Edge. | 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 WebSocket Gateway boundary before extracting or scaling it. |
| Session Directory | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Acknowledge the sender, then fan out to online gateways and offline inboxes. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents WebSocket Gateway from also owning the contract and failure behavior of Auth / Membership. | 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 devices race receipt cursors” to WebSocket 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 Session Directory boundary before extracting or scaling it. |
| Auth / Membership | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Devices resume from cursors; receipt updates coalesce to monotonic sequence advances. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Session Directory from also owning the contract and failure behavior of Conversation Router. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Regional partition owner becomes unavailable” to Session Directory. | 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 Auth / Membership boundary before extracting or scaling it. |
| Conversation Router | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authenticate the socket and resolve its gateway in the session directory. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Auth / Membership from also owning the contract and failure behavior of Message Sequencer. | 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 “Gateway dies after log append before acknowledgment” to Auth / Membership. | 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 Conversation Router boundary before extracting or scaling it. |
| Message Sequencer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Route a send to the conversation partition and recheck membership version. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Conversation Router from also owning the contract and failure behavior of Partitioned Message Log. | 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 “Large group fan-out overwhelms online delivery” to Conversation Router. | 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 Message Sequencer boundary before extracting or scaling it. |
| Partitioned Message Log | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Deduplicate client_msg_id, assign the next partition sequence, and durably append. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Message Sequencer from also owning the contract and failure behavior of Inbox Fanout. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Membership revoked during an in-flight send” to Message Sequencer. | 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 Partitioned Message Log boundary before extracting or scaling it. |
| Inbox Fanout | Executes idempotent asynchronous work under lease and retry policy. In this design it participates in: Acknowledge the sender, then fan out to online gateways and offline inboxes. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Partitioned Message Log from also owning the contract and failure behavior of Push Service. | Perform the work before acknowledging the caller. This gives simpler consistency but unbounded tail latency and fragile retries. Here that simpler choice would couple “Two devices race receipt cursors” to Partitioned Message Log. | Costs leases, checkpoints, retries, DLQs, and lag operations. Separate once execution time or burstiness no longer fits the request deadline. Measure the latency, saturation, lag, or mismatch at the Inbox Fanout boundary before extracting or scaling it. |
| Push Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Devices resume from cursors; receipt updates coalesce to monotonic sequence advances. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Inbox Fanout from also owning the contract and failure behavior of Presence Store. | 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 “Regional partition owner becomes unavailable” to Inbox Fanout. | 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 Push Service boundary before extracting or scaling it. |
| Presence Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Authenticate the socket and resolve its gateway in the session directory. | Defines the source of truth and commit boundary. It prevents Push Service from also owning the contract and failure behavior of Receipt Aggregator. | 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 “Gateway dies after log append before acknowledgment” to Push 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 Presence Store boundary before extracting or scaling it. |
| Receipt Aggregator | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Route a send to the conversation partition and recheck membership version. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Presence Store from also owning the contract and failure behavior of Media Store. | 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 “Large group fan-out overwhelms online delivery” to Presence 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 Receipt Aggregator boundary before extracting or scaling it. |
| Media Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Deduplicate client_msg_id, assign the next partition sequence, and durably append. | Defines the source of truth and commit boundary. It prevents Receipt Aggregator from also owning the contract and failure behavior of Offline Sync API. | 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 “Membership revoked during an in-flight send” to Receipt Aggregator. | 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 Media Store boundary before extracting or scaling it. |
| Offline Sync API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Acknowledge the sender, then fan out to online gateways and offline inboxes. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Media Store from also owning the contract and failure behavior of operators and repair tooling. | 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 “Two devices race receipt cursors” to Media Store. | 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 Offline Sync API boundary before extracting or scaling it. |