Camada Zero · 31 · Relógios & Ordenação de Eventos

Você não pode confiar no relógio de parede pra ordenar eventos entre máquinas, porque eles divergem. Relógio lógico resolve isso medindo causalidade em vez de tempo. Adiciona eventos e manda mensagens entre os 3 processos, alterna entre Lamport e Vector, e clica num evento pra ver quem é causa, quem é efeito e quem é concorrente.
0Eventos
0Pares concorrentes
LamportVisão ativa
passado causal futuro causal concorrente selecionado
A pergunta de fundo: "esse evento aconteceu antes daquele?" Entre máquinas, o relógio físico não responde com confiança. Lamport (1978) trocou tempo por causalidade: um contador que só cresce, que viaja junto com cada mensagem. O vector clock leva isso adiante e consegue dizer quando dois eventos são concorrentes, ou seja, nenhum pôde ter influenciado o outro.
MecanismoDetecta concorrência?Custo/eventoOrdem
LamportNãoO(1)total (arbitrária)
VectorSimO(n)parcial (causal)

Lamport clock em Go

type Lamport struct{ t int }

// evento local ou send
func (c *Lamport) Tick() int {
    c.t++
    return c.t
}

// ao receber, msgT veio junto na mensagem
func (c *Lamport) OnReceive(msgT int) int {
    if msgT > c.t {
        c.t = msgT
    }
    c.t++
    return c.t
}

Vector clock em Go

type VClock []int // um contador por nó

func (v VClock) Tick(self int) {
    v[self]++
}

func (v VClock) Merge(o VClock, self int) {
    for i := range v {
        if o[i] > v[i] { v[i] = o[i] }
    }
    v[self]++
}

🧠 Desafio — Relógios & Eventos

Brinca com o visualizador antes de responder: carrega o exemplo, alterna pra Vector e clica nos eventos pra ver concorrência. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.