1

我想在 cassandra 1.2 CQL 3.0 上实现一个实时内容排名系统

示例:根据用户投票提供新闻的前 10 条评论

  • 用户可以评论新闻
  • 用户可以对每条评论投票 +1 或 -1

内容可能有 100、1000、10k、100k 条评论

所以我需要的是根据投票分数获得实时(或延迟 5 分钟)前 10 条评论

[真实示例 youtube 评论]

我的解决方案是:

  • 在计数器表上存储投票计数器 (content_counter)
  • 创建排名表

创建表 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 的所有数据都存储在按分数 desc 排序的 1 行中
  • 我只有我这个表评论至少有 1 票

那么当用户投票时会发生什么

  • SELECT score FROM content_counter where content_id='x' (R: 123)
  • UPDATE content_counter SET score=score+1 (124)(或-1)

批量:

  • 删除 content_comment_rank WHERE content_id='x' AND score=123 AND com_id='y'
  • 插入 content_comment_rank (content_id,score,com_id) 值 ('x',124,'y')

因此,拥有内容的前 10 条评论是

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

这很容易,但我不确定我是否做得很好,因为:

  • 如何处理复制和并发投票

    也许通过每天批量更新 1 次(就像在视频 youtube 上的投票一样)

  • 也许有更好的方法......

我们需要“计数器表上的集群排序”.....(全部在 1 个原子查询中完成)但不存在(或不存在......)

你对我的解决方案有什么建议?

谢谢,

4

1 回答 1

1

@Sebastien Kondov

您正在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 回答