Every connector in Basalt promises exactly-once delivery. For years the textbook answer to that promise has been two-phase commit, and for years it has been the reason streaming systems stall when one participant is slow.
Why we left 2PC behind
A two-phase commit needs every sink to vote before anything is visible. One slow disk in one region holds back every partition in the transaction. At 1.2 million events per second that turns a hiccup into a backlog.
Three small pieces instead
- Every partition stamps events with a 64-bit sequence that only ever goes up.
- Sinks are idempotent: writing the same sequence twice is a no-op, so retries are free.
- Writers hold an epoch. A new writer bumps the epoch and older writers are fenced out on their next write.
Together these give the same guarantee as 2PC without a coordinator. A failed writer is replaced in under a second, and nothing waits for a vote.
Exactly-once is not a protocol. It is a contract between the log and the sink, and the contract can be very small.
What it costs
The sequence adds eight bytes per event and the epoch check adds one comparison per batch. In return, recovery after a node loss dropped from 41 seconds to 0.8 seconds in our chaos tests.
Sigrún leads the query engine team in Reykjavík. Before Basalt she worked on storage at a Nordic payments company, where she learned to distrust any latency number without a percentile next to it.



