| Browser / SDK | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate and canonicalize the destination; run synchronous deny-list checks. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Anycast DNS. | 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 “Viral code overloads one cache shard” 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 Browser / SDK boundary before extracting or scaling it. |
| Anycast DNS | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Reserve a numeric ID range locally, allocate one ID, and Base62 encode it. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Browser / SDK from also owning the contract and failure behavior of CDN / 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 “Client times out after alias commit” to Browser / SDK. | 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 Anycast DNS boundary before extracting or scaling it. |
| CDN / Edge | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Conditionally insert code→URL; custom aliases use a uniqueness constraint. | Removes repeated work from the latency-critical path. It prevents Anycast DNS from also owning the contract and failure behavior of Redirect API. | 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 “Editable destination races with cached redirect” to Anycast DNS. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (120K peak redirects/s · 6B links · p99 < 100 ms) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the CDN / Edge boundary before extracting or scaling it. |
| Redirect API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: On redirect, read edge/process cache, then Redis, then the owning metadata shard. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents CDN / Edge from also owning the contract and failure behavior of URL Create API. | 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 “ID worker loses its range lease” to CDN / 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 Redirect API boundary before extracting or scaling it. |
| URL Create API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Return redirect immediately and publish a sampled/deduplicated click event asynchronously. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Redirect API from also owning the contract and failure behavior of Redis Cache. | 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 “Analytics lag grows without affecting redirects” to Redirect API. | 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 URL Create API boundary before extracting or scaling it. |
| Redis Cache | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Validate and canonicalize the destination; run synchronous deny-list checks. | Removes repeated work from the latency-critical path. It prevents URL Create API from also owning the contract and failure behavior of Short-Code Router. | 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 “Viral code overloads one cache shard” to URL Create API. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (120K peak redirects/s · 6B links · p99 < 100 ms) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Redis Cache boundary before extracting or scaling it. |
| Short-Code Router | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Reserve a numeric ID range locally, allocate one ID, and Base62 encode it. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Redis Cache from also owning the contract and failure behavior of Metadata Shards. | 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 “Client times out after alias commit” to Redis Cache. | 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 Short-Code Router boundary before extracting or scaling it. |
| Metadata Shards | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Conditionally insert code→URL; custom aliases use a uniqueness constraint. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Short-Code Router from also owning the contract and failure behavior of Range ID Allocator. | 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 “Editable destination races with cached redirect” to Short-Code 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 Metadata Shards boundary before extracting or scaling it. |
| Range ID Allocator | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: On redirect, read edge/process cache, then Redis, then the owning metadata shard. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Metadata Shards from also owning the contract and failure behavior of Kafka Click Stream. | 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 “ID worker loses its range lease” to Metadata Shards. | 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 Range ID Allocator boundary before extracting or scaling it. |
| Kafka Click Stream | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Return redirect immediately and publish a sampled/deduplicated click event asynchronously. | Decouples bursts and failure from user acknowledgment. It prevents Range ID Allocator from also owning the contract and failure behavior of Analytics Workers. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Analytics lag grows without affecting redirects” to Range ID Allocator. | 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 Kafka Click Stream boundary before extracting or scaling it. |
| Analytics Workers | Executes idempotent asynchronous work under lease and retry policy. In this design it participates in: Validate and canonicalize the destination; run synchronous deny-list checks. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Kafka Click Stream from also owning the contract and failure behavior of OLAP Store. | Perform the work before acknowledging the caller. This gives simpler consistency but unbounded tail latency and fragile retries. Here that simpler choice would couple “Viral code overloads one cache shard” to Kafka Click Stream. | 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 Analytics Workers boundary before extracting or scaling it. |
| OLAP Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Reserve a numeric ID range locally, allocate one ID, and Base62 encode it. | Defines the source of truth and commit boundary. It prevents Analytics Workers from also owning the contract and failure behavior of Abuse Scanner. | 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 “Client times out after alias commit” to Analytics Workers. | 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 OLAP Store boundary before extracting or scaling it. |
| Abuse Scanner | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Conditionally insert code→URL; custom aliases use a uniqueness constraint. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents OLAP Store from also owning the contract and failure behavior of Config / SLOs. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Editable destination races with cached redirect” to OLAP 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 Abuse Scanner boundary before extracting or scaling it. |
| Config / SLOs | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: On redirect, read edge/process cache, then Redis, then the owning metadata shard. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Abuse Scanner from also owning the contract and failure behavior of operators and repair tooling. | 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 “ID worker loses its range lease” to Abuse Scanner. | 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 Config / SLOs boundary before extracting or scaling it. |