Camada Zero · 28 · Replicação & Quórum

Você tem a mesma informação em vários nós. Quando elas discordam, quem ganha? Quórum é a regra. Mexe no W e no R aqui embaixo e veja a leitura virar stale na hora em que os conjuntos param de se cruzar.
3N réplicas
2W (escrita)
2R (leitura)
SIMW+R > N?
Última leitura
3/3Nós vivos
N réplicas, todas vivas, na versão 0. Faça uma escrita e depois uma leitura.
réplica viva tem a versão mais nova recebendo escrita sendo lida caiu
Replicar é guardar o mesmo dado em vários nós. Resolve duas coisas: se um nó morre o dado sobrevive, e dá pra servir leitura da réplica mais perto do usuário. O preço é decidir o que fazer quando as cópias discordam.

Quórum é a regra: a escrita só confirma depois que W nós aceitam, a leitura consulta R nós e fica com a versão mais nova que viu. Se W+R > N, o conjunto que você escreveu e o conjunto que você lê obrigatoriamente compartilham pelo menos um nó, e esse nó tem o valor recente. É casa dos pombos. O Dynamo da Amazon deixou N, W e R na mão de quem usa justamente pra você escolher onde quer ficar entre consistência, latência e disponibilidade.
ConfigO que você ganha
W+R > Nleitura sempre vê a última escrita
W+R ≤ Nleitura pode vir stale (eventual)
syncdurável, latência do nó mais lento
asyncrápida, risco de perda se o líder cair

Quórum em Go (pseudo)

func write(reps []*Replica, val Value, W int) error {
    val.Version = nextVersion()
    acks := 0
    for _, r := range reps {
        if r.Send(val) { // propaga
            acks++
            if acks >= W { return nil } // quórum fechado
        }
    }
    return ErrQuorumUnreachable
}

func read(reps []*Replica, R int) (Value, error) {
    var latest Value
    got := 0
    for _, r := range reps {
        v, ok := r.Get()
        if !ok { continue }
        got++
        if v.Version > latest.Version { latest = v }
        if got >= R { break }
    }
    if got < R { return latest, ErrQuorumUnreachable }
    return latest, nil // se W+R>N, latest é a última escrita
}

// consistência forte exige interseção dos quóruns
func strong(N, W, R int) bool { return W+R > N }

🧠 Desafio — Replicação & Quórum

Mexe nos sliders e roda escrita/leitura antes de responder. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.