| Document operation log |
Cosmos DB for NoSQL, partition key = document id, strong consistency in-region, conditional append on epoch, TTL for the 30-day horizon |
Microsoft Azure |
DynamoDB with conditional writes; Spanner; a per-document table in PostgreSQL at lower document counts |
900 million mostly-idle logs need a free idle partition and a conditional append, which is a key-space problem rather than a throughput one |
ADR-09 |
| Ownership lease and fence |
One Cosmos DB item per document with an ETag-conditional claim and a monotonic epoch, checked on every append |
Microsoft Azure |
etcd or Consul leases; Blob lease; ZooKeeper; DynamoDB conditional writes |
The fence must be enforced by the store that holds the data, on the same round trip as the write |
ADR-03 |
| Session tier |
Memory-optimised AKS node pool across three zones, one authoritative session per document, sockets terminated in-process |
Microsoft Azure |
EKS or GKE; Service Fabric stateful services; Cloudflare Durable Objects for a smaller estate |
The sequencer and the socket share a process, which is what makes a p99 120 ms acknowledgement credible |
ADR-01 |
| Presence and viewer fan-out |
Azure Web PubSub, one group per document, published by the session host after 10 Hz coalescing |
Microsoft Azure |
AWS API Gateway WebSockets with IoT Core; Ably or Pusher; self-hosted NATS or Centrifugo |
Buys connection scale for the traffic that is allowed to be lost, and keeps 1,000 viewers off the sequencing node |
ADR-06 |
| Checkpoints and assets |
Blob Storage, RA-GZRS, content-addressed asset containers with pre-signed upload URLs and lifecycle tiering |
Microsoft Azure |
S3 with pre-signed PUT; Google Cloud Storage; MinIO on-premises |
Large immutable objects belong in object storage, out of the ordering path and priced by tier |
ADR-13 |
| Asset scanning |
Microsoft Defender for Storage malware scanning on write, scan state carried on the asset row |
Microsoft Azure |
GuardDuty Malware Protection for S3; ClamAV in a scanning pipeline |
An unscanned asset must be referenceable but not servable, which is a state on the record rather than a gate on the upload |
ADR-13 |
| Control plane store |
Azure Database for PostgreSQL Flexible Server, zone-redundant HA, read replicas for admission lookups |
Microsoft Azure |
Aurora PostgreSQL; Cloud SQL; CockroachDB for multi-region grants |
Grants, versions and comments are small, relational, transactional and read on every admission — a different problem from the log |
ADR-14 |
| Capability cache |
Azure Cache for Redis, 5-minute ceiling on cached capabilities |
Microsoft Azure |
ElastiCache; Memorystore; in-process caches with a shorter ceiling |
Keeps the control plane off the hot path while bounding how stale an authority decision may be |
ADR-14 |
| Identity |
Microsoft Entra ID for workforce identity, Entra External ID for guest and link access, in-band token renewal on the live connection |
Microsoft Azure |
Okta or Auth0; Cognito; Keycloak self-hosted |
A connection must never outlive its credential, and link viewers must be first-class without accounts |
ADR-14 |
| Keys |
Key Vault Managed HSM, tenant-scoped keys, customer-managed keys on the enterprise tier |
Microsoft Azure |
AWS KMS with external key store; Cloud KMS; Thales or Entrust HSM on-premises |
Per-tenant confidentiality with an auditable exception path, and a key the customer can hold |
ADR-15 |
| Edge |
Azure Front Door with WAF, WebSocket pass-through, document-aware routing to the session holding the lease |
Microsoft Azure |
CloudFront with ALB; Cloud Load Balancing; Envoy with a custom control plane |
Admission, abuse control and TLS belong at the edge; routing must respect the lease rather than load |
ADR-06 |
| Observability |
Azure Monitor with managed Prometheus and Grafana, metadata-only telemetry, divergence checksums as a first-class metric |
Microsoft Azure |
Amazon Managed Prometheus with Grafana; Cloud Operations; self-hosted Prometheus, Thanos and Grafana |
The two signals that matter — divergence and read-only minutes — have no substitute and must be alertable |
ADR-17 |
| Build and release |
GitHub Actions to Azure Container Registry with attestation, convergence replay as a required check, drain-based rollout on AKS |
Microsoft Azure |
Azure DevOps; GitLab CI with Argo Rollouts; Cloud Build with Cloud Deploy |
Convergence has to be a gate, and a rollout has to be a drain rather than a hot swap |
ADR-05 |
| Derived feeds |
Cosmos DB change feed into Event Hubs for search indexing and audit export, ADLS Gen2 for the metadata-only analytics export |
Microsoft Azure |
DynamoDB Streams with Kinesis; Datastream with Pub/Sub; Debezium with Kafka |
Derived consumers read the record and never the edit path, so a slow index can never slow an edit |
ADR-09 |