我想在cassandra 1.2 CQL 3.0上实现实时内容排名系统
示例:根据用户投票提供有关新闻的前10条评论
根据内容可能有100,1000,10k,100k评论
所以我需要的是根据投票得分获得实时(或延迟5分钟)前10条评论
[真实示例youtube评论]
我的解决方案是:
创建表content_comment_rank( content_id timeuuid, 得分bigint, com_id timeuuid, PRIMARY KEY(content_id,score,com_id) )具有聚类顺序(得分DESC)
那么当用户投票时会发生什么
在批处理中:
所以对内容的前10条评论是
SELECT * FROM content_comment_rank WHERE content_id ='x'LIMIT 10
这很简单,但我不确定我做得好,因为:
如何处理复制和并发投票
也许每天批量更新一次(这就像视频youtube投票一样)
也许有更好的方法....
我们需要“在计数器表上进行集群排序”.....(所有在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
这个想法是: