What correctness under failure forbids
What this article forbids
- Exactly-once delivery. Permanent, from the two generals result. No protocol closes it.
- Preventing a duplicate at the sender. The ambiguity is the sender's; the state is the receiver's.
- Exact dedup over unbounded delay with bounded state. Every window is a bet that is correlated against you.
- Exactly-once over an effect the system does not own. Side effects in user code are outside every boundary.
- A correct commit ordering when position and effect live in separate stores. Only 2PC or idempotence helps, never a better order.
- Approximate dedup without risking loss. The false positive points the wrong way.
- Telling a poison pill from a transient fault in general. Attempt count is a proxy that misfires during incidents.
- A writer-enforced visibility guarantee. Uncommitted output is physically readable; the rule lives in the reader.
Escapes and what each costs
| Escape | Buys | Costs | Paid by |
|---|---|---|---|
| Absorbing algebra (SET, MAX, delete) | idempotence for free | only absolute operations; relative ones need CAS | the concurrency path |
| Deterministic addressing / overwrite | idempotence with no dedup state | the unit of work must have a stable name | pipeline design, once |
| Idempotency key + stored outcome | works for arbitrary effects | unbounded state, so a window that is a silent bet | the data, silently, when the window is short |
| Sequence numbers | O(producers) state, and gap detection | requires ordering and durable producer identity | autoscaling, which breaks identity |
| Offset in the sink | deletes the second write entirely | couples position to the sink schema; one sink only | portability |
| Two-phase sink commit | exactly-once with a foreign sink | visibility latency = commit interval; timeout fragility | the consumer's latency budget |
| Epoch-based output | O(1) state, plus zombie fencing | all-or-nothing re-execution; readers must comply | anyone reading the raw path |
| DLQ / skip | the pipeline keeps moving | completeness broken with no signal | downstream aggregates, silently |
| Stop-the-line | correctness preserved | availability, and a human on the critical path | the service-level target |
The free rows have the same shape as in earlier parts: choose the algebra, and name the work rather than the attempt. Both are design-time decisions that cost nothing at runtime, and both are reached for only after the expensive mechanisms have failed.