Skip to content
About
Main content

What correctness under failure forbids

What this article forbids

  1. Exactly-once delivery. Permanent, from the two generals result. No protocol closes it.
  2. Preventing a duplicate at the sender. The ambiguity is the sender's; the state is the receiver's.
  3. Exact dedup over unbounded delay with bounded state. Every window is a bet that is correlated against you.
  4. Exactly-once over an effect the system does not own. Side effects in user code are outside every boundary.
  5. A correct commit ordering when position and effect live in separate stores. Only 2PC or idempotence helps, never a better order.
  6. Approximate dedup without risking loss. The false positive points the wrong way.
  7. Telling a poison pill from a transient fault in general. Attempt count is a proxy that misfires during incidents.
  8. A writer-enforced visibility guarantee. Uncommitted output is physically readable; the rule lives in the reader.

Escapes and what each costs

EscapeBuysCostsPaid by
Absorbing algebra (SET, MAX, delete)idempotence for freeonly absolute operations; relative ones need CASthe concurrency path
/ overwriteidempotence with no dedup statethe unit of work must have a stable namepipeline design, once
+ stored outcomeworks for arbitrary effectsunbounded state, so a window that is a silent betthe data, silently, when the window is short
O(producers) state, and gap detectionrequires ordering and durable producer identityautoscaling, which breaks identity
in the sinkdeletes the second write entirelycouples position to the sink schema; one sink onlyportability
exactly-once with a foreign sinkvisibility latency = ; fragilitythe consumer's latency budget
O(1) state, plus zombie fencingall-or-nothing re-execution; readers must complyanyone reading the raw path
/ skipthe pipeline keeps movingcompleteness broken with no signaldownstream aggregates, silently
Stop-the-linecorrectness preserved, and a human on the critical paththe 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.