September 10, 2026
Building reliable data pipelines without hiding the hard parts
Reliability is not the absence of failure. It is the ability to understand failure, contain it, and recover without turning every incident into archaeology.

Most data pipelines look simple on a whiteboard: read an event, transform it, write the result. Production replaces each arrow with a network boundary and every box with a new way to fail.
The useful question is not whether a pipeline will fail. It is whether the system makes that failure bounded, visible, and safe to repeat. These properties need to be designed together; adding a retry queue at the end rarely creates them by accident.
Design for failure, not success
Start by naming the states between accepted and complete. A message can be received but not parsed, parsed but not enriched, enriched but not persisted. If all of those states collapse into “processing,” operators have no reliable place to begin.
Every stage should own a narrow contract: its input, its durable output, and the errors it can produce. That makes partial progress visible and lets recovery begin at the smallest safe boundary.
Make every write repeatable
At-least-once delivery is the practical default for many systems. The same event will arrive twice eventually, so correctness depends on making duplicate work harmless.
INSERT INTO ledger (event_id, account_id, amount)
VALUES (:event_id, :account_id, :amount)
ON CONFLICT (event_id) DO NOTHING;An idempotency key belongs to the business operation, not the delivery attempt. Preserve it across queues and services, and enforce it at the final write boundary where duplicates become costly.
Observability is part of the design
A healthy dashboard is not proof that every record arrived. Track throughput between stages, processing age, retry depth, and terminal failures. The most useful metric is often the difference between what entered one boundary and what left the next.
If you cannot identify where an individual event stopped, you do not yet have an observable pipeline.
Attach a stable correlation identifier at ingress and carry it through logs, traces, dead-letter records, and writes. This turns an investigation from a broad search into a directed walk.
Keep recovery boundaries small
Large batch retries are operationally convenient and logically dangerous. They repeat successful work alongside failed work, expand blast radius, and make progress difficult to measure. Prefer checkpoints that describe exactly what has committed.
A dead-letter queue is not a recovery strategy by itself. Treat it as a diagnostic buffer with an owner, a retention policy, and a tested path back into the pipeline.
What reliability actually means
A reliable pipeline does not promise that nothing goes wrong. It promises that failures remain legible: duplicates do not corrupt state, partial work can resume, and operators can explain the fate of a record without guessing.
Build those guarantees into the boundaries first. Performance tuning and scaling become much less frightening once correctness survives repetition.
Related tags