como incrementar rapidamente contadores em Cassandra sem staleness
Eu tenho uma pergunta sobre Cassandra. Você sabe como o Cassandra faz atualizações / incrementos de contadores?
Eu quero usar um parafuso de tempestade (CassandraCounterBatchingBolt do repositório storm-contrib no github) que grava no cassandra. No entanto, não tenho certeza de como parte da implementação do método incrementCounterColumn () funciona. E também há limitações nos contadores cassandra (de:http://wiki.apache.org/cassandra/Counters), o que os torna inúteis para o meu cenário IMHO:
Se uma gravação falhar inesperadamente (tempo limite ou perda de conexão com o nó do coordenador), o cliente não saberá se a operação foi executada. Uma nova tentativa pode resultar em um excesso de contagem CASSANDRA-2495.
A remoção do contador é intrinsecamente limitada. Por exemplo, se você emitir muito rapidamente a sequência "incrementar, remover, incrementar", é possível que a remoção seja perdida
Enfim, aqui está o meu cenário:
Eu atualizo o mesmo contador mais rapidamente do que as atualizações se propagam para outros nós do Cassandra.
Exemplo:
Digamos que eu tenho 3 nós cassandra. Os contadores em cada um desses nós são 0.
Nó1: 0, nó2: 0, nó3: 0
Um incremento vem: 5 -> Nó1: 0, nó2: 0, nó3: 0
O incremento inicia no nó 2 - ainda precisa se propagar para o nó1 e o nó3
Nó1: 0, nó2: 5, nó3: 0
Enquanto isso, outro incremento chega antes do incremento anterior
é propagado: 3 -> Nó1: 0, nó2: 5, nó3: 0
Assumindo que 3 inicia em um nó diferente daquele em que 5 começou, temos:
Nó1: 3, nó2: 5, nó3: 0
Agora, se 3 for propagado para os outros nós como um aumento e não como um novo valor (e o mesmo para 5), eventualmente os nós serão todos iguais a 8 e é isso que eu quero.
Se 3 sobrescreve 5 (porque possui um carimbo de data / hora posterior), isso é problemático - não é o que eu quero.
Você sabe como essas atualizações / incrementos são tratados pelo Cassandra?
Observe que uma leitura antes de uma gravação ainda é suscetível ao mesmo problema, dependendo de qual nó de réplica a leitura é executada (o Quorum ainda pode falhar se a propagação não estiver muito adiantada)
Também estou pensando que talvez colocar um cache em preto e branco e Cassandra possa resolver esse problema, mas isso é uma história para outra hora.