| API Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Normalize tenant, identity, route, and cost into one stable limit key. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Global Edge. | 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 “Redis unavailable forces explicit fail-open/closed policy” to the external caller. | 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 API Client boundary before extracting or scaling it. |
| Global Edge | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Evaluate a signed local policy snapshot before touching remote state. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents API Client from also owning the contract and failure behavior of Gateway Worker. | 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 “Hot enterprise tenant saturates one counter shard” to API 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 Edge boundary before extracting or scaling it. |
| Gateway Worker | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Spend a small local token lease when available; otherwise execute one atomic Redis script. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Global Edge from also owning the contract and failure behavior of Local Token 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 “Clock boundary creates fixed-window burst” to Global 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 Gateway Worker boundary before extracting or scaling it. |
| Local Token Cache | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Return allowed, remaining, reset, and retry-after without blocking on metrics. | Removes repeated work from the latency-critical path. It prevents Gateway Worker from also owning the contract and failure behavior of Limiter Library. | 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 “Policy versions differ across gateways” to Gateway Worker. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (1M requests/s · < 2 ms decision · 99.99% availability) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Local Token Cache boundary before extracting or scaling it. |
| Limiter Library | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Stream decisions for billing, anomaly detection, and lease reconciliation. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Local Token Cache from also owning the contract and failure behavior of Key Normalizer. | 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 “Retries consume quota twice without request identity” to Local Token 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 Limiter Library boundary before extracting or scaling it. |
| Key Normalizer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize tenant, identity, route, and cost into one stable limit key. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Limiter Library from also owning the contract and failure behavior of Redis Cluster. | 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 “Redis unavailable forces explicit fail-open/closed policy” to Limiter Library. | 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 Key Normalizer boundary before extracting or scaling it. |
| Redis Cluster | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Evaluate a signed local policy snapshot before touching remote state. | Removes repeated work from the latency-critical path. It prevents Key Normalizer from also owning the contract and failure behavior of Lua / Atomic Counter. | 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 “Hot enterprise tenant saturates one counter shard” to Key Normalizer. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (1M requests/s · < 2 ms decision · 99.99% availability) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Redis Cluster boundary before extracting or scaling it. |
| Lua / Atomic Counter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Spend a small local token lease when available; otherwise execute one atomic Redis script. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Redis Cluster from also owning the contract and failure behavior of Policy 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 “Clock boundary creates fixed-window burst” to Redis Cluster. | 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 Lua / Atomic Counter boundary before extracting or scaling it. |
| Policy Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Return allowed, remaining, reset, and retry-after without blocking on metrics. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Lua / Atomic Counter from also owning the contract and failure behavior of Policy Snapshot CDN. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Policy versions differ across gateways” to Lua / Atomic Counter. | 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 Policy Service boundary before extracting or scaling it. |
| Policy Snapshot CDN | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Stream decisions for billing, anomaly detection, and lease reconciliation. | Removes repeated work from the latency-critical path. It prevents Policy Service from also owning the contract and failure behavior of Decision Metrics. | 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 “Retries consume quota twice without request identity” to Policy Service. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (1M requests/s · < 2 ms decision · 99.99% availability) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Policy Snapshot CDN boundary before extracting or scaling it. |
| Decision Metrics | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize tenant, identity, route, and cost into one stable limit key. | Proves correctness and supports controlled recovery. It prevents Policy Snapshot CDN from also owning the contract and failure behavior of Quota Audit Log. | 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 “Redis unavailable forces explicit fail-open/closed policy” to Policy Snapshot CDN. | 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 Decision Metrics boundary before extracting or scaling it. |
| Quota Audit Log | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Evaluate a signed local policy snapshot before touching remote state. | Proves correctness and supports controlled recovery. It prevents Decision Metrics from also owning the contract and failure behavior of operators and repair tooling. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Hot enterprise tenant saturates one counter shard” to Decision Metrics. | 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 Quota Audit Log boundary before extracting or scaling it. |