Production Data Systems Handbook / Chapter 45
Building a Data Platform: Paved Roads, Guardrails, and Escape Hatches
Design a data platform that makes common safe choices easy, adds operational guardrails by default, and gives unusual workloads a reviewable exception path.
Preparing audio…
Audio edition
Building a Data Platform: Paved Roads, Guardrails, and Escape Hatches
Two Requests Reach the Platform Team
On the same morning, two teams ask for a production data store. The checkout team needs transactional order state, familiar queries, durable backups, controlled schema changes, and a path into analytics. The fraud team needs bounded-depth traversal across users, accounts, devices, cards, and addresses while those relationships change throughout the day.
A platform can fail both teams in opposite ways. If it offers only a menu of infrastructure, checkout must assemble backups, access, migrations, dashboards, cost tags, and a runbook from scattered examples. Every ordinary decision becomes local invention. If the platform mandates one relational design for every workload, the fraud team must either force traversal into a poor fit or quietly build an unsupported system.
The useful middle is not one blessed stack. A data platform is a productized decision system. It makes the safe common choice easy, refuses a small number of unacceptable states, and gives an unusual workload a route to prove what it needs. For checkout, that should mean a short paved road from request to an operable store. For fraud, it should mean an escape hatch with evidence and ownership rather than an informal exemption.
Decide What Deserves a Road
A platform should remove low-value decision work, not architectural judgment. A team launching a routine service should not have to invent backup defaults, encryption settings, migration mechanics, access review, metrics, cost tags, restore drills, and runbook structure. Those choices are part of the organization’s operating system. Repeating them by hand creates drift.
The first platform decision is which workloads are common enough to deserve paved roads. For a mid-sized SaaS company, that usually includes:
- transactional application state with strong local invariants;
- durable event publication and consumption;
- analytics ingestion from operational systems;
- bounded caching for latency or load relief;
- full-text or faceted search over product data;
- object storage for files, exports, imports, and archives;
- migration, backfill, and reconciliation workflows;
- observability, backup, restore, access, retention, and cost attribution.
The checkout request fits the transactional road. That conclusion should remove work, not end thought. A paved road without an operating promise is only a starter template. The promise should cover who owns the path, which workload it fits, what it does not fit, how it is provisioned, what comes with it, how it is observed, how it is restored, how it changes, and how a team exits when the path stops fitting.
A further decision is where the platform refuses unsafe ambiguity. A table with restricted customer data needs classification and access policy. A critical store needs backups and a tested restore route. A migration that removes a field still read by production needs to fail before deployment. A stream consumer needs idempotency and lag visibility. These are not style preferences. They are the minimum operating envelope.
The Checkout Team Takes the Paved Road
A paved road is a supported answer to a recurring workload. It should be easier to use than a custom path and safer than a copied example. “Use Postgres” or “publish events to Kafka” is not a paved road. A paved road includes provisioning, limits, examples, operational defaults, ownership, documentation, diagnostics, and an escalation route.
Checkout begins with the OLTP road, but its orders will also produce events, feed analytics, and perhaps populate a cache or search index. Those adjoining roads should preserve the same discipline.
The default OLTP path might provision a relational database schema, connection pool configuration, migration runner, backup policy, point-in-time recovery setting, slow-query dashboard, alert policy, cost tags, access groups, and a runbook. Its workload fit is transactional business state with clear invariants and predictable access paths. Its limitations are equally important: it is not the place for unbounded analytical scans, high-volume telemetry, ad hoc support queries against production, or a cache disguised as a source of truth.
The eventing path might provide an outbox pattern, schema registry or contract check, idempotency guidance, dead-letter handling, consumer lag metrics, replay procedure, and ownership metadata for each topic or stream. It should say which events are facts, which are commands, what ordering is promised, what duplicates consumers must tolerate, and how long replay remains possible.
The analytics path might define how operational facts leave source systems, how schemas evolve, how personally sensitive fields are handled, how freshness is measured, how lineage reaches the catalog, and how quality checks fail. A team should not have to rediscover that a warehouse table needs an owner, freshness expectation, transformation version, and downstream consumer list.
The cache path might provide supported cache clients, key conventions, TTL defaults, invalidation patterns, serialization rules, stampede protection, fallback behavior, and dashboards for hit rate, eviction, latency, and error rate. It should be explicit that cached data is derived data. If a team wants the cache to become the only durable copy, that is not a cache path; it is a new source-of-truth proposal.
The search path might provide indexing jobs, document schema conventions, freshness targets, relevance tuning hooks, rebuild tools, delete propagation, access filtering, and a query dashboard. Search is often where privacy, freshness, and product behavior collide. The paved road should make it hard to index restricted fields without policy and easy to rebuild from source after a bad deployment.
The best roads are executable. For checkout, a provisioning workflow creates the store, secrets, network policy, backup, dashboard, alerts, runbook, owners, tags, and catalog entry together. A template repository can show the shape; the workflow prevents each team from omitting a different operational promise. Documentation explains judgment. Tooling removes ceremony.
The Road Has Edges
Guardrails should be attached to the roads, not bolted on at launch review. A platform that says “remember to configure backups” has not solved backups. A platform that provisions a backup policy, records the restore objective, schedules a drill reminder, and exposes restore status has turned an intention into an operating fact.
Some guardrails should block. A destructive migration against a production table should require proof that no production reader depends on the field, a dual-read or compatibility period, and a rollback or repair plan. A critical store without backups should not reach production. A dataset classified as restricted should not be exported to a broad analytics group. A search index containing private fields should not bypass the same access filters as the source application.
Other guardrails should warn, report, or create review work. A slow query, unused index, unusual cardinality jump, aging restore drill, growing dead-letter queue, rising warehouse scan volume, or missing owner may not justify stopping a deploy. It does justify visibility and a named follow-up.
The checkout team’s first destructive migration makes the distinction concrete. A missing compatibility period can make old application instances fail during a rolling deployment, so the migration blocks. An unused index discovered in the same review may increase cost without threatening this release, so it creates owned follow-up work. If every concern blocks, teams learn to avoid the platform. If nothing blocks, they discover risk during incidents. Blocking checks should be few, high-signal, and tied to failure modes the organization is unwilling to accept. Advisory checks should be visible, ranked, and owned.
Every guardrail also needs its own product discipline. Who owns the rule? How are false positives fixed? How does a team appeal? When does a warning become a blocker? Which incident or audit finding justified the guardrail? Stale guardrails are a platform smell. They preserve yesterday’s fear after the system has changed.
Self-Service for Risky Work
Self-service is not the absence of control. It is the ability to perform ordinary work through controlled paths without waiting for a specialist to type commands manually. The more dangerous the operation, the more the platform should encode rehearsal, visibility, and rollback.
Provisioning is only the first self-service surface. A useful platform lets teams run schema migrations, request access, publish data contracts, schedule backfills, initiate restore drills, inspect cost, rotate secrets, view consumer lag, rebuild derived stores, and deprecate datasets through supported workflows.
Migrations and backfills deserve special attention because they are where calm architecture becomes dangerous production behavior. A migration tool should support expand-and-contract changes, preflight checks, online execution where appropriate, lock-risk warnings, progress reporting, pause and resume, batch sizing, rate limits, and clear failure states. A backfill tool should provide checkpoints, idempotency keys, dry runs, sampled verification, reconciliation queries, stop conditions, and a way to avoid saturating the live system.
Checkout soon needs to backfill customer_region onto existing orders. This is not just a script. The platform path should ask where the region truth comes from, what happens when historical records disagree, how the job is chunked, what metrics show progress, how retries avoid duplicate side effects, how live writes are handled during the run, how downstream tables are reconciled, and who approves completion.
Restore drills should be similarly boring. A team should be able to restore a recent backup into an isolated environment, run a smoke test, compare row counts or control totals, record elapsed time, and update the runbook without a heroic production exercise. Critical systems still need formal drills, but the platform should make practice cheap enough that recovery is not a ceremony performed once a year.
Good self-service leaves evidence. A restore drill result, migration approval, backfill reconciliation, access grant, and exception review should be discoverable later by on-call engineers, auditors, and future maintainers.
The Fraud Workload Leaves the Road
Escape hatches are not favors. They are how the platform admits that defaults are hypotheses. A default path is appropriate because it fits many workloads, not because it fits all workloads.
The fraud request should begin with a workload fingerprint. The team describes data shape, read and write patterns, latency, freshness, consistency, durability, retention, privacy, growth, tenant model, recovery objectives, operational maturity, and failure modes. The request must explain why the paved road fails.
“We prefer a graph database” is not a reviewable exception. “We need bounded-depth relationship traversal across user, account, device, and risk entities; the edge set changes throughout the day; query latency must stay under the product decision budget; precomputing paths produces unacceptable staleness; the default relational path produced these query plans and operational risks” is reviewable. The second version may still be wrong, but it gives reviewers something to test.
The exception ADR should compare the default path to the proposed path, name rejected alternatives, identify new operating burden, define backup and restore, describe observability, assign service and platform owners, state security and retention implications, estimate cost, and set a review trigger. The review trigger might be a date, traffic threshold, cost threshold, incident, compliance milestone, or product decision.
An exception should also have an exit story. Some exceptions graduate into a new paved road because many teams need the same pattern. Some retire when an experiment ends. Some migrate back to the default path after workload evidence changes. Some remain permanent but get explicit ownership and review. The dangerous case is the unreviewed exception that quietly becomes the organization’s sixth semi-supported data platform.
Recurring exceptions are product feedback. If teams repeatedly ask for high-volume event replay, a better stream replay path may be missing. If teams repeatedly bypass the analytics loader for freshness, the analytics path may not meet product needs. If teams repeatedly request specialty search, the default search path may be too narrow. The platform team should study exceptions the way a product team studies churn.
Metrics That Reveal Whether the Platform Works
Platform adoption is a useful number and a dangerous one. A mandatory platform can have high adoption and low trust. A good platform can have low early adoption because teams do not know it exists, cannot understand it, or find one missing feature that blocks their real work.
Measure outcomes that correspond to the platform’s decision job:
- time from service creation to production-ready data path;
- percentage of critical stores with tested backups and recent restore drills;
- restore-drill pass rate and actual restore time versus objective;
- percentage of data paths with named service owner, platform owner, and on-call route;
- percentage of datasets with classification, retention, lineage, and consumer visibility;
- migration failure rate, rollback rate, and incidents caused by schema or backfill work;
- stream consumer lag incidents, dead-letter age, and replay success;
- cost attribution coverage by team, service, dataset, and environment;
- exception count, exception age, review compliance, and graduation or retirement rate;
- security review defects found before production versus after production;
- incident reduction, mean time to detect, and mean time to repair for supported paths.
Use qualitative evidence too. Read exception ADRs. Interview teams that abandoned onboarding. Study incidents where teams bypassed a guardrail. Look at support tickets that repeat the same confusion. A platform is an internal product, but the goal is not internal-product theater. The goal is safer, faster, more reviewable production data work.
Cost metrics should include human cost. A cheaper self-managed store that only two people can restore at 03:00 may be more expensive than a managed service with stronger recovery tooling. A default path that saves infrastructure spend but creates slow migrations, fragile backfills, and manual audit work may have moved cost rather than reduced it. Make cost visible enough that teams can reason about it as a design constraint before the bill becomes an incident.
Write the Service Catalog as a Promise
A service-catalog entry should let the checkout team decide that the OLTP road fits without arranging a meeting. Start with the workload class and whether the data is authoritative or derived. Name the supported technology and versions, but put limits and ownership beside the name. A technology label without fit boundaries is an endorsement, not guidance.
Then state what provisioning produces. Secrets, network policy, backups, dashboards, alerts, access groups, cost tags, runbook, and catalog registration should appear as one operating package. State the user-facing SLO, freshness promise where relevant, recovery point and time objectives, restore-drill cadence, and escalation route. A team should know what it receives and what it still owns.
Describe how the path changes: schema and contract migration, backfill, replay, rebuild, and deprecation. Include its default observability, retention, cost attribution, data classification, least-privilege access, audit evidence, and deletion propagation. Link working examples and a first-production walkthrough, then name the support route when the example stops being enough.
Finish with limitations in workload language. Say, for example, that this OLTP road does not support unbounded analytical scans or low-latency multi-hop traversal; do not hide behind “contact the platform team.” Immediately follow the limitation with the exception route: workload fingerprint, ADR, operating owner, platform reviewer, review trigger, and exit criteria. The catalog has done its job when checkout can proceed confidently and fraud can make a precise case for leaving the road.
Platform Design Drill
Design the first service catalog for a mid-sized SaaS company. Include an OLTP path, eventing path, analytics ingestion path, cache path, search path, object-storage path, observability baseline, backup policy, access model, migration workflow, backfill workflow, restore drill, and cost attribution model.
Then write one exception ADR for adopting a graph database. The ADR must state the workload fingerprint, why the paved roads fail, what alternatives were rejected, who operates the exception, how backup and restore work, which dashboards and alerts prove health, what data protection rules apply, what cost is expected, when the exception will be reviewed, and what would cause it to graduate, migrate, or retire.
If the exception does not explain why the paved road fails, it is preference. If the paved road cannot explain where it fits and where it fails, it is marketing.
Continue reading
Full table of contents