【问题标题】:Keep denormalized table consistent (synchronized) in Cassandra DB在 Cassandra DB 中保持非规范化表一致(同步)
【发布时间】:2017-09-15 08:42:36
【问题描述】:

我正在探索 Cassandra DB,我遇到了 this video,它解释了如何对表进行非规范化以存储 cmets,它是这样的:

该表中没有 cmets 表和 users_id 列,该表指向用户编写评论,另一个表是视频表,而 cmets 表中的 video_id 列指向已评论的视频.

我们将有两个 cmets 表,一个 cmets_by_user 和另一个 comment_by_video 问题是如何保持这两个表同步?

当用户观看视频时,我们会在 cmets_by_video 和 cmets_by_user 中分别为视频和用户插入评论。但是,如果第二次插入失败怎么办?

当我们为该用户选择所有 cmets 时,我们会收到用户对视频的评论,但无法找到该视频?

【问题讨论】:

    标签: cassandra nosql


    【解决方案1】:

    您可以为此目的使用Batch Statement。但请注意,该批处理语句速度较慢,并且会将大约 30% 的开销放在协调节点上的常规操作上。

    【讨论】:

      【解决方案2】:

      一个选项是前面答案中提到的批处理语句,这将产生性能影响。

      另一个选项,我可以考虑尝试在写入失败时将一致性级别更改为 ANY。在一致性为“任何”的情况下,您的数据将在配置的时间量内保存在协调节点中,并在其他负责节点出现时复制到该节点。

      对于任何失败的写入,在您的代码中处理它并将该插入的一致性更改为 ANY 并再次执行插入。当然,在任何负责节点获取数据之前,您将无法读取该数据。

      function retryWrites(...)
      try{
      //insert statement
      }catch<writeexception>{
      //set consistency to ANY 
      //insert failed statement
      //set consistency back to wherever is required.
      }
      
      call retryWrites(statement1)
      call retryWrites(statement2)
      

      【讨论】:

        猜你喜欢
        • 2021-10-20
        • 2016-05-05
        • 2019-02-20
        • 2014-10-03
        • 2016-05-13
        • 1970-01-01
        • 2016-05-27
        • 2018-07-31
        • 2017-10-23
        相关资源
        最近更新 更多