| Desktop / Web Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Create an upload session and return signed part URLs. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Global 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 “Commit arrives before final part replication” 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 Desktop / Web Client boundary before extracting or scaling it. |
| Global API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Upload chunks independently; verify length and checksum at the storage edge. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Desktop / Web Client from also owning the contract and failure behavior of Auth / Sharing. | 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 update the same base version” to Desktop / Web 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 Global API boundary before extracting or scaling it. |
| Auth / Sharing | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Build an immutable ordered manifest only when all required parts exist. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Global API from also owning the contract and failure behavior of Metadata Service. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Shared-link permission is revoked while cached” to Global API. | 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 / Sharing boundary before extracting or scaling it. |
| Metadata Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Atomically advance current_version and append one change-journal entry. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Auth / Sharing from also owning the contract and failure behavior of Upload Coordinator. | 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 “Chunk dedupe leaks cross-tenant existence” to Auth / Sharing. | 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 Metadata Service boundary before extracting or scaling it. |
| Upload Coordinator | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Sync clients resume from a monotonic cursor and resolve divergent edits as versions. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Metadata Service from also owning the contract and failure behavior of Chunk Hash Service. | 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 “Journal cursor points to compacted history” to Metadata 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 Upload Coordinator boundary before extracting or scaling it. |
| Chunk Hash Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Create an upload session and return signed part URLs. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Upload Coordinator from also owning the contract and failure behavior of Multipart Session 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 “Commit arrives before final part replication” to Upload Coordinator. | 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 Chunk Hash Service boundary before extracting or scaling it. |
| Multipart Session Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Upload chunks independently; verify length and checksum at the storage edge. | Defines the source of truth and commit boundary. It prevents Chunk Hash Service from also owning the contract and failure behavior of Object Blob 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 “Two devices update the same base version” to Chunk Hash 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 Multipart Session Store boundary before extracting or scaling it. |
| Object Blob Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Build an immutable ordered manifest only when all required parts exist. | Defines the source of truth and commit boundary. It prevents Multipart Session Store from also owning the contract and failure behavior of Version Manifest DB. | 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 “Shared-link permission is revoked while cached” to Multipart Session Store. | 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 Object Blob Store boundary before extracting or scaling it. |
| Version Manifest DB | Owns authoritative versioned state or immutable evidence. In this design it participates in: Atomically advance current_version and append one change-journal entry. | Defines the source of truth and commit boundary. It prevents Object Blob Store from also owning the contract and failure behavior of Change Journal. | 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 “Chunk dedupe leaks cross-tenant existence” to Object Blob Store. | 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 Version Manifest DB boundary before extracting or scaling it. |
| Change Journal | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Sync clients resume from a monotonic cursor and resolve divergent edits as versions. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Version Manifest DB from also owning the contract and failure behavior of Sync Cursor 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 “Journal cursor points to compacted history” to Version Manifest DB. | 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 Change Journal boundary before extracting or scaling it. |
| Sync Cursor Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Create an upload session and return signed part URLs. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Change Journal from also owning the contract and failure behavior of Virus Scanner. | 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 “Commit arrives before final part replication” to Change Journal. | 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 Sync Cursor Service boundary before extracting or scaling it. |
| Virus Scanner | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Upload chunks independently; verify length and checksum at the storage edge. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Sync Cursor Service from also owning the contract and failure behavior of Thumbnail Workers. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Two devices update the same base version” to Sync Cursor 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 Virus Scanner boundary before extracting or scaling it. |
| Thumbnail Workers | Executes idempotent asynchronous work under lease and retry policy. In this design it participates in: Build an immutable ordered manifest only when all required parts exist. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Virus Scanner from also owning the contract and failure behavior of CDN / Download. | Perform the work before acknowledging the caller. This gives simpler consistency but unbounded tail latency and fragile retries. Here that simpler choice would couple “Shared-link permission is revoked while cached” to Virus Scanner. | 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 Thumbnail Workers boundary before extracting or scaling it. |
| CDN / Download | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Atomically advance current_version and append one change-journal entry. | Removes repeated work from the latency-critical path. It prevents Thumbnail Workers from also owning the contract and failure behavior of operators and repair tooling. | 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 “Chunk dedupe leaks cross-tenant existence” to Thumbnail Workers. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (10 PB stored · 50 GB objects · 100K concurrent uploads) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the CDN / Download boundary before extracting or scaling it. |