| Global ingress and TLS termination |
Global external Application Load Balancer, one anycast VIP, Google-managed certificates |
Google Cloud |
Self-managed proxy fleet on regional addresses with DNS failover |
A single anycast VIP makes regional evacuation a health-check outcome rather than a DNS propagation race, which is what allows a 120 s client-visible RTO. DNS failover cannot make that promise because resolver caches are outside the platform's control. |
ADR-14 |
| Edge protection |
Cloud Armor — managed WAF rules, DDoS absorption, geo and IP policy per API product |
Google Cloud |
WAF filters inside the proxy fleet |
Volumetric absorption has to happen before traffic reaches capacity that is sized for legitimate load. A WAF inside the fleet protects the upstreams and not the fleet, which is the wrong half of the problem. |
ADR-14 |
| Request-plane proxy |
Envoy on GKE regional node pools, one pod per unit of capacity |
Open source on Google Cloud |
A fully managed API gateway product |
The resident-state design in ADR-01 requires control over what the proxy caches and when it refreshes. A managed gateway owns those decisions, and they are precisely the ones this architecture is built from. |
ADR-01 |
| Configuration store |
Spanner, versioned rows with a digest and parent version |
Google Cloud |
Cloud SQL with read replicas |
Configuration is small, globally read, and must be strongly consistent on write across regions so two operators cannot create conflicting versions. That is the one workload where a globally consistent store earns its cost. |
ADR-02 |
| Configuration distribution |
Signed snapshots in a dual-region Cloud Storage bucket, pulled by the proxies |
Google Cloud |
xDS streaming from a control-plane service |
A pod restarting during a control-plane outage must still be able to come up serving. Object storage is a far smaller dependency than a control-plane service, and a signed snapshot is verifiable without trusting the channel. |
ADR-02 |
| Rate-limit counters |
Memorystore for Redis, sharded by principal, one Lua evaluation per request |
Google Cloud |
Spanner, or per-instance counters only |
The counter is the one hot-path dependency and needs single-digit-millisecond reads with atomic multi-scope evaluation. A durable store would be over-specified for data that is explicitly safe to lose (ADR-06). |
ADR-05 |
| Credential store |
Spanner, verifiers and issuer keys only, no recoverable secrets |
Google Cloud |
Secret Manager per credential |
The access pattern is a point read per credential at high rate from two regions, and the platform deliberately holds no secret to protect — only a verifier. Secret Manager solves a problem this design removes. |
ADR-03 |
| Revocation distribution |
Pub/Sub fan-out to every proxy, acknowledged with a denylist version |
Google Cloud |
Short cache TTLs and polling |
A 30 s revocation SLO with a 5-minute cache TTL needs a push. Polling fast enough to meet the SLO would turn the credential store into a hot-path dependency by another name. |
ADR-03 |
| Usage and evidence pipeline |
Pub/Sub into BigQuery, partitioned by day and tenant |
Google Cloud |
Direct writes to an analytics store from the proxy |
The emission path must absorb backpressure without touching the request path. A buffered bus is what makes "sample down, then drop" a telemetry decision rather than a latency event. |
ADR-16 |
| Audit ledger |
Object storage with retention lock, written from the same bus, 7-year retention |
Google Cloud |
The analytics store with a long partition expiry |
Audit needs immutability that survives an operator with database permissions. A retention lock is a different guarantee from a long retention setting, and the difference is the whole point. |
ADR-18 |
| Control-plane services |
Cloud Run for the Config API, developer portal and rollout controller |
Google Cloud |
The same GKE clusters as the proxies |
Running the control plane on the serving clusters would put it in the same failure domain as the thing whose outage it is supposed to survive. Separation here is the point, and the scale-to-zero economics are a free extra. |
ADR-01 |
| Developer portal and product catalogue |
Apigee-style product model — API products, plans, subscriptions — implemented over the Config API |
Google Cloud pattern |
A bespoke portal with routes as the unit of subscription |
Subscribing to a product rather than a route is what makes plan tiers, scopes and version pins expressible at all. Route-level subscription cannot express "this customer is on v1 until March". |
ADR-10 |
| Upstream authentication |
Mutual TLS with workload identity, plus a signed request-bound identity assertion |
Google Cloud + open standard |
Trusted headers on a private VPC |
Network reachability is not authentication in an estate of 120 services. Binding the assertion to the request identifier is what stops it being replayed onto a different call. |
ADR-08 |
| Metrics, traces and alerting |
Cloud Monitoring and Cloud Trace, with fault attribution as a first-class dimension |
Google Cloud |
Self-hosted Prometheus and a trace backend |
The differentiating requirement is not the backend but the tagging: separating gateway faults from upstream faults at emission. That is a filter decision, and it works the same on any backend. |
ADR-16 |