Conceitos
Relógios vetoriais para versionamento causal
Intuição
Imagine duas pessoas editando a mesma lista de compras compartilhada em celulares diferentes, sem conexão, e sincronizando depois. Se a edição de uma pessoa claramente aconteceu depois de ela ver a da outra (ela acrescentou itens a uma lista já atualizada), basta manter a versão mais nova. Mas se as duas editaram a lista original ao mesmo tempo, sem ver as mudanças uma da outra, não há jeito honesto de dizer que uma "veio depois" da outra — é preciso olhar as duas edições e combiná-las. Um relógio vetorial (vector clock) é uma forma de o sistema distinguir essas duas situações automaticamente, sem precisar de relógios de parede sincronizados.
Como funciona
Como os sloppy quorums e o hinted handoff do Dynamo permitem aceitar escritas mesmo quando algumas réplicas estão inalcançáveis, escritas concorrentes na mesma chave podem ser feitas sem que nenhum dos escritores saiba do outro, produzindo versões divergentes do objeto. O Dynamo marca cada versão de um objeto com um relógio vetorial — um conjunto de pares (nó, contador) — que registra quais nós trataram atualizações daquele objeto e quantas. Comparando dois relógios vetoriais, um nó consegue determinar se o relógio de uma versão é descendente estrito do da outra, o que significa que ela a supera causalmente e a versão mais antiga pode ser descartada, ou se nenhum relógio domina o outro, o que significa que as duas versões foram escritas concorrentemente, sem conhecimento uma da outra, e estão em conflito. Quando o Dynamo não consegue estabelecer uma ordem causal entre versões dessa forma, ele não escolhe um vencedor de forma arbitrária nem as mescla silenciosamente; em vez disso, devolve todas as versões conflitantes à aplicação solicitante, junto com seus relógios vetoriais, e deixa para a aplicação reconciliá-las com lógica específica do domínio.
Na prática
O exemplo canônico do Dynamo é um carrinho de compras: quando não consegue ordenar causalmente duas versões divergentes do carrinho, ele devolve ambas à aplicação, que as reconcilia unindo os itens, em vez de perder a adição de qualquer um dos clientes. Recorra a relógios vetoriais (ou a um mecanismo equivalente de causalidade, como o adotado por Riak e Voldemort) quando um sistema precisa continuar aceitando escritas sob partições e atualizações concorrentes, e a aplicação, e não a camada de armazenamento, é quem está em melhor posição para resolver conflitos genuínos.
Use em um desenho
Pratique na escola de System Design os casos que dependem deste conceito.