2012-01-27 5 views

答えて

7

CassandraスリフトAPIには、「incrementAndGet」操作はありません。

カサンドラのカウンターは最終的に一貫性があり非アトミックです。脆弱なConsistencyLevel.ALLオペレーションは、「更新されることが保証される」カウンタ値を得るために必要であり、すなわち一貫した読み取りを実行する。 ConsistencyLevel.QUORUMで十分ではありません(カウンターデザイン文書で指定されているとおり:https://issues.apache.org/jira/secure/attachment/12459754/Partitionedcountersdesigndoc.pdf)。 最初はカウンタ値を読んで

が一貫したに見えるincrementAndGetメソッドを実装するには、あなたが望むかもしれない、そして インクリメント突然変異、およびリターンを発行する(値を読み込む+ INC)。

たとえば、以前のカウンタ値が(異なるレプリカで)10〜20で、1つが50を加算すると、read-before-incrementは60または70のいずれかを返します。また、read-after-または20。

+0

非常に興味深いアプローチ、ありがとう! – tom

+0

これはどのようにカウンターが原子にならないという問題を解決しますか?たとえば、私がもう1回(インクリメントとリード)操作を行うと、それでも古い値を得ることができます: コール1: カウンタ値:1 読み取り(取得)、インクリメント(呼び出し) )、戻り値2 呼び出し2:(最後のインクリメント呼び出しがすべてのノードを伝播していない) 読み取り(取得)、インクリメント(呼び出し)、戻り値2 –

+0

@AlastorMoody:このメソッドは、 *一貫して見えるカウンタを実装する。カサンドラカウンタは最終的には本質的に一貫しているため、重要なパフォーマンスへの影響(つまり分散ロックによる)でカウンタをアトミックにすることは可能です。あなたが本当に原子カウンターが必要な場合 - カサンドラ(レディスのようなもの)以外にもたくさんのツールがあります。 – Wildfire

0

それを行う唯一の方法は、それを照会することです。 Cassandraではインクリメント・アンド・リード・機能はありません。

関連する問題