2017-06-06 3 views
0

私は、カウンターを使用するアプリケーションのデータモデリングにいくつかの困難を発見しています。Cassandra counter usage

アプリは基本的にメッセージングアプリです。メッセージは無料のユーザーに限定されているため、カウンタの列を使用して合計数を記録する初期の計画です。

バッチ(ログに記録されているかどうか)は、標準テーブルとカウンタの両方の操作を含むことができません。実行しようとしている操作とカウンタの更新をまとめて実行できない場合は、どうすれば正しいかどうかを確認できますか?基本的に列に競合状態がなく、個々のユーザーに関連付けられている場合は、カウンタータイプが本当に必要ですか?

私の2番目の考え方は、標準のint列を使用してバッチ内のみを使用することです。これは実行可能な選択肢ですか?あなたは絶対に、各ユーザーは、あなたが仕事を実行するために、プレーンint Sに依存している可能性があり、同時に複数のupdateが生成されることを保証することができる場合

はあなたに

+0

[Cassandraの[Counter Vs Int列]の可能な複製?](https://stackoverflow.com/questions/35412377/counter-vs-int-column-in-cassandra) –

+0

ありがとう、私は質問を読んだ。競合状態を避けるためにカウンタータイプが必要であると述べています。私の場合は、列が各ユーザー専用であるため、私はそれを持っているとは思わない。それが状況であれば、標準のintカラムを使用するのはいいですか? – riccamini

+0

(たとえば)同じユーザーが2台のデバイスを同時に使用しないことを保証できますか? – xmas79

答えて

0

ありがとうございます。

しかし、問題は、読み書き前のアンチパターンを実行する必要があることです。これを解決することもできます。たとえば、intをキャッシュして読み込み部分をスキップし、メモリ内の更新を実行した後に書き込みを行うだけです。これは、システムをキャッシングサーバー(例:Redis)に接続することで実現できます。

無料のユーザーが送信できるメッセージの数がいくつかの値にバインドされている場合は、ログイン/試行時にチェックを実行する必要があるため、このカウンタをいつでも読んでおく必要があります。新しいメッセージを送信する/ダッシュボード/ etcを見て、そのアクションをブロックする。

別のオプション(各ユーザーが送信したメッセージをどこかに保存し、システムを複雑にしたくない場合)は、非常に非効率的になる可能性があるにもかかわらず、SELECT COUNT...クエリで直接数えることができますすぐにカサンドラの世界で。

+0

私は、最初のカウンタ読取り部分のためのキャッシュ解決策、次に一貫性を保証するためにカウント更新とメッセージそのもののバッチを行うことにします。それでも、あなたが言ったように、これはすべてカウンターの競争条件を避けることができるという事実に依存しています。代わりにカウンタータイプを使用する別の解決策は見当たりませんが、間違っていますか?ありがとうございました – riccamini