…
<HistServ>
bob-answerer joined the channel
…
<HistServ>
alice-asker joined the channel
…
<HistServ>
viewer joined the channel
…
<alice-asker>
hey, can someone explain why TCP uses three-way handshake instead of two? what would actually break with just SYN/SYN-ACK?
…
<bob-answerer>
the third ACK is for the client to confirm it received the server's SYN-ACK. without it the server has no way to know its SYN-ACK arrived, so it can't safely allocate the connection — it would either commit too early (and waste resources on lost connects) or refuse to commit (and lose real ones).
…
<bob-answerer>
the deeper reason: both sides need to agree on each other's initial sequence numbers before sending data. a two-way only proves the server saw the client's SYN; the third ACK proves the client saw the server's SYN. without that you can't safely send the first data byte.
…
<alice-asker>
got it — so two-way would be enough to authenticate a request, but not enough to establish a synchronized bidirectional stream. thanks.
…
<bob-answerer>
hey, bob here — happy to take questions
…
<alice-asker>
Question for the room: when do you actually need a total order across all operations (Raft/Paxos-style consensus) vs. when is a causal or per-key order enough? Specifically thinking about systems where forcing a single global log becomes the throughput bottleneck — what's your rule of thumb for picking the weaker ordering?
…
<bob-answerer>
good question. my rule of thumb: you only need total order when correctness depends on multiple independent objects agreeing on the same sequence — e.g. a ledger where balance(A) and balance(B) must both reflect a transfer atomically, or leader election where two nodes must not believe they're leader at the same logical instant.
…
<bob-answerer>
if every invariant you care about is scoped to a single key (or a single shard), per-key linearizability is enough and you can shard the log — that's basically how Spanner, DynamoDB, and most modern stores escape the single-Raft-group bottleneck.
…
<bob-answerer>
causal is the right call when users mostly need 'I see my own writes' and 'effects come after their causes' — comments after the post they reply to, etc. Great for collaborative apps, social feeds, chat. The cost is you give up cross-object invariants, so any 'sum across keys' or 'unique constraint' gets awkward.
…
<bob-answerer>
concrete heuristic I use: write down the invariants first. for each one, ask 'which keys does this touch?' if the answer is always 'one', shard and use per-key consensus. if it crosses keys but rarely, use a 2PC/transaction layer over sharded logs. only reach for a single global log when the invariants are truly global and you can afford the throughput ceiling.