2012-01-27 14 views

Respuesta

7

No hay una sola operación 'incrementAndGet' en la API de ahorro Cassandra.

Los contadores en Cassandra son eventualmente constantes y no atómicos. Se requiere la operación Frágil de consistenciaLevel.ALL para obtener el valor de contador "garantizado para ser actualizado", es decir, realizar una lectura consistente. ConsistencyLevel.QUORUM no es suficiente (como se especifica en el documento de diseño de contadores: https://issues.apache.org/jira/secure/attachment/12459754/Partitionedcountersdesigndoc.pdf).

Para poner en práctica el método incrementAndGet que ve consistente, es posible que desee leer en un primer momento valor del contador, a continuación, emitir incremento mutación y de retorno (leer el valor + inc).

Por ejemplo, si el valor del contador anterior es 10 a 20 (en diferentes réplicas), y uno agrega 50 a él, read-before-increment devolverá 60 o 70. Y read-after-increment puede devolver 10 o 20.

+0

Enfoque muy interesante, gracias! – tom

+0

cómo resolverá esto la cuestión de que los contadores no sean atómicos. Por ejemplo, si realizo una operación más (incremento y lectura), es posible obtener el valor anterior: llamada 1: contador val: 1 lectura (obtiene 1), incremento en 1 (llamada emitida)), return 2 llamada 2: (la última llamada incremental no se ha propagado a través de todos los nodos) lectura (obtiene 1), incremento en 1 (llamada emitida), devolución 2 –

+0

@AlastorMoody: como dije, este método permite para implementar contadores que * se vean * consistentes. Dado que los contadores de cassandra son finalmente consistentes por naturaleza, solo es posible hacer contadores atómicos al precio de un impacto significativo en el rendimiento (es decir, con bloqueos distribuidos). Si realmente necesita contadores atómicos, hay muchas herramientas aparte de Cassandra (como Redis) – Wildfire

0

La única forma de hacerlo es buscarlo. No hay funcionalidad de incremento en la lectura disponible en Cassandra.

Cuestiones relacionadas