2012-01-27 7 views

risposta

7

Non esiste un'unica operazione "incrementAndGet" in Cassandra parsimonia API.

I contatori in Cassandra sono alla fine coerenti e non atomici. Per ottenere il valore del contatore "garantito per essere aggiornato", è necessario eseguire un'operazione ConsistencyLevel.ALL fragile, ovvero eseguire una lettura coerente. ConsistencyLevel.QUORUM non è sufficiente (come specificato nel documento di progettazione dei contatori: https://issues.apache.org/jira/secure/attachment/12459754/Partitionedcountersdesigndoc.pdf).

Per implementare il metodo incrementAndGet che sembra coerente, si potrebbe desiderare in un primo momento leggere controvalore, quindi emettere incremento mutazione, e il ritorno (valore letto + inc).

Ad esempio, se il valore del contatore precedente è compreso tra 10 e 20 (su repliche diverse) e uno aggiunge 50 ad esso, read-before-increment restituirà 60 o 70. E il read-after-increment potrebbe ancora restituire 10 o 20.

+0

Approccio molto interessante, grazie! – tom

+0

come risolverà il problema dei contatori che non sono atomici. Ad esempio, se eseguo un'altra operazione (incremento e lettura), è possibile che continui ad ottenere il vecchio valore: chiamata 1: contatore val: 1 lettura (ottiene 1), incremento di 1 (chiamata emessa), restituire 2 chiamata 2: (l'ultima chiamata di incremento non si è propagata attraverso tutti i nodi) read (gets 1), incremento di 1 (chiamata emessa), return 2 –

+0

@AlastorMoody: Come detto, questo metodo consente implementare contatori che * sembrano * coerenti. Dal momento che i contatori cassandra alla fine sono coerenti per natura, è possibile rendere i contatori atomici solo al prezzo di un impatto significativo sulle prestazioni (vale a dire con i blocchi distribuiti). Se hai davvero bisogno di contatori atomici - ci sono molti strumenti a parte Cassandra (come Redis) – Wildfire

0

L'unico modo per farlo è la ricerca. Non è disponibile la funzionalità di incremento/lettura in Cassandra.

Problemi correlati