Duas réplicas precisam aceitar incrementos enquanto estão desconectadas. Se trocam apenas o total, somar os valores de novo após retransmitir uma mensagem pode contar a mesma operação duas vezes. Um G-Counter baseado em estado guarda um componente por réplica.
Mescle os estados por componente
Parta de {A: 2, B: 1}. Durante a desconexão, A faz um incremento e chega a {A: 3, B: 1}. B faz dois e chega a {A: 2, B: 3}. A mesclagem escolhe o máximo para cada componente e produz {A: 3, B: 3}. A leitura soma os componentes e retorna 6. Mesclar outra vez o primeiro estado deixa o resultado intacto.
A função de mesclagem é comutativa, associativa e idempotente. Em um teste, varie a ordem das mensagens, agrupe mesclagens de maneiras diferentes e entregue uma mensagem duplicada. As réplicas devem concordar depois de receberem os mesmos estados.
Identidade e limites
Cada réplica incrementa apenas o seu componente. Se duas instâncias independentes reutilizam o mesmo ID, o máximo pode descartar incrementos de uma delas. Um contador restaurado com estado mais antigo também precisa preservar a monotonicidade ou usar uma nova identidade conforme o protocolo. Para subtrações, o PN-Counter usa dois contadores crescentes e calcula a diferença na leitura.
Shapiro et al., A comprehensive study of convergent and commutative replicated data types
Leia também: Hashing consistente e redistribuição de chaves no anel