1

Cassandra 1.2 CQL 3.0にリアルタイムコンテンツランキングシステムを実装したい

例 : ユーザーの投票に基づいて、ニュースに関する上位 10 のコメントを提供する

  • ユーザーはニュースにコメントできます
  • ユーザーは各コメントに +1 または -1 を投票できます

コンテンツごとにおそらく100、1000、10k、100kのコメント

だから私が必要とするのは、投票スコアに基づいてトップ10のコメントをリアルタイム(または5分遅れ)で取得することです

【実例youtubeコメント】

私の解決策は次のとおりです。

  • カウンター テーブル (content_counter) に投票カウンターを格納する
  • ランク表を作る

create table content_comment_rank ( content_id timeuuid, score bigint, com_id timeuuid, PRIMARY KEY (content_id, score, com_id) ) WITH CLUSTERING ORDER BY (score DESC)

  • content_id のすべてのデータは、score desc で並べられた 1 つの ROW に格納されます
  • このテーブルのコメントには少なくとも 1 票が必要です

ユーザーが投票するとどうなるか

  • SELECT スコア FROM content_counter where content_id='x' (R: 123)
  • UPDATE content_counter SET スコア=スコア+1 (124) (または -1)

バッチで:

  • 削除 content_comment_rank WHERE content_id='x' AND スコア=123 AND com_id='y'
  • INSERT content_comment_rank (content_id,score,com_id) VALUES ('x',124,'y')

したがって、コンテンツの上位 10 件のコメントを持つことは、

SELECT * FROM content_comment_rank WHERE content_id='x' LIMIT 10

とても簡単ですが、うまくいっているかどうかはわかりません。理由は次のとおりです。

  • レプリケーションと同時投票の処理方法

    たぶん、毎日1回バッチで更新することによって(ビデオyoutubeへの投票が機能しているようです)

  • もっといい方法があるかも……。

「カウンターテーブルでのクラスターの順序付け」が必要です.....(すべて1つのアトムクエリで実行されます)が、存在しません(または存在しません...)

私の解決策についてあなたのアドバイスは何ですか?

ありがとうございました、

4

1 に答える 1

1

@セバスチャン・コンドフ

content_comment_rankテーブルのカウンター値 (スコア) を複製しています。Cassandra の分散カウンター テーブルcontent_counterとテーブルcontent_comment_rankのカウンター値が一致しない場合があります

これを軽減するために、QUORUM 整合性レベルでこのテーブルを読み書きしたいかもしれませんが、確かにパフォーマンスにコストがかかります。

ここで、リアルタイムでカウントする際にミスマッチが発生することがどれほど重要かによって異なります。ある程度のエラー率が許容できる場合、ソリューションは完全に適しています。その後、バックグラウンドで、バッチを実行してcontent_countercontent_comment_rankを再同期できます。

レプリケーションと同時投票の処理方法

--> 同時投票では、content_counterテーブルは強い一貫性を提供します。content_comment_rankの場合、最後の書き込みが優先されます

もっといい方法があるかも……。

この記事を読むことができます: http://nathanmarz.com/blog/how-to-beat-the-cap-theorem.html

アイデアは次のとおりです。

  1. content_comment_rankテーブルに投票を保存するリアルタイム プロセスを用意し、カウントのエラーを受け入れます。
  2. content_counterテーブルを信頼できる情報源として使用して、別のcorrect_content_comment_rankテーブルにデータを書き込む、カウンターの不一致を修正するバッチをバックグラウンドで実行します。このバッチ プロセスは頻繁に実行する必要がありますが、過去数時間のデータのみを読み取り、修正します。
  3. 上位 10 件のコメントに対するクエリの場合、content_comment_rankcorrect_content_comment_rankの間で結果をマージできます
于 2013-09-20T16:00:51.717 に答える