01
Dois carimbos corretos que descrevem uma ordem impossível
O incidente costuma aparecer como um dado absurdo, não como um erro. Uma resposta anterior à pergunta, um pedido cancelado antes de ser criado, uma sessão que durou menos zero vírgula dois segundos. Ninguém suspeita do relógio primeiro, porque o relógio é a peça de infraestrutura em que todo mundo confia sem pensar. A investigação começa procurando erro de fuso horário, depois erro de serialização, depois condição de corrida no código, e só no fim alguém compara a hora de duas máquinas e descobre que elas discordam em oitenta e sete milissegundos.
A causa raiz não é o desvio em si, é a suposição embutida no código. Quando o serviço A grava createdAt com o relógio dele e o serviço B grava updatedAt com o relógio dele, e alguma consulta depois ordena os dois campos juntos, o sistema está afirmando que existe uma linha do tempo única compartilhada por máquinas independentes. Essa linha do tempo não existe. O que existe é um conjunto de relógios que aproximam a mesma referência com erro variável, e o erro é pequeno o suficiente para passar despercebido em desenvolvimento e grande o suficiente para inverter a ordem de dois eventos separados por poucos milissegundos em produção.
LINHA DO TEMPO REAL (referencia absoluta, inobservavel) t=0ms t=12ms | | v v envio resposta O QUE CADA SERVICO GRAVOU servico-mensageria (relogio +45ms) envio -> 10:00:00.045 servico-inbox (relogio -42ms) resposta -> 10:00:00.011 (!) CONSULTA QUE ORDENA POR carimbo 10:00:00.011 resposta 10:00:00.045 envio <- ordem invertida, dados corretos desvio total entre os dois relogios: 87ms intervalo real entre os dois eventos: 12ms qualquer par de eventos separado por menos de 87ms pode inverter
A regra que sai desse desenho é o único parâmetro que importa: dois eventos gravados por máquinas diferentes só têm ordem confiável se o intervalo entre eles for maior que o desvio máximo entre os relógios envolvidos. Num ambiente com sincronização por NTP bem configurada em rede local, esse desvio fica na casa de poucos milissegundos. Em contêineres com relógio virtualizado, em máquinas virtuais que sofreram migração ao vivo ou em regiões diferentes com caminhos de rede assimétricos, ele passa facilmente de cem milissegundos. Toda decisão de ordenação baseada em carimbo de parede está apostando que os eventos nunca vão acontecer mais perto do que esse número, e essa aposta é perdida justamente sob carga, quando os eventos ficam mais próximos.