Cassandra实时内容排名解决方案

时间:2013-09-20 15:01:28

标签: cassandra cql cql3

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

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

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

根据内容可能有100,1000,10k,100k评论

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

[真实示例youtube评论]

我的解决方案是:

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

创建表content_comment_rank( content_id timeuuid, 得分bigint, com_id timeuuid, PRIMARY KEY(content_id,score,com_id) )具有聚类顺序(得分DESC)

  • content_id的所有数据都存储在由score desc
  • 订购的1行上
  • 我只有这张表评论至少有一票

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

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

在批处理中:

  • DELETE content_comment_rank WHERE content_id ='x'AND score = 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

这很简单,但我不确定我做得好,因为:

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

    也许每天批量更新一次(这就像视频youtube投票一样)

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

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

您对我的解决方案有何建议?

谢谢,

1 个答案:

答案 0 :(得分:1)

@Sebastien Kondov

您正在 content_comment_rank 表中复制计数器值(得分)。您可能在Cassandra分布式计数器表 content_counter 与表 content_comment_rank

中的计数器值不匹配

为了减轻您可能想要使用QUORUM一致性级别在此表中进行写入和读取,但肯定会有性能成本。

现在,这取决于你实时计算不匹配的重要性。如果可以接受一些%错误率,那么您的解决方案是完全合适的。之后,在后台,您可以运行批次以重新同步 content_counter content_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_rank correct_content_comment_rank
  4. 之间合并结果