可靠地更新Cassandra中的大量行的最佳实践(关系更新)

时间:2017-04-19 07:29:57

标签: cassandra

我有一些彼此相关的表,它看起来像这样:

organizations: 
- id
- name
- ... other fields

users:
- id
- name
- organization_id
- organization_name
- ... other fields

我在organization_name表中保留users字段,这样就无需查找组织以获取组织名称

问题是,如果更改了组织名称,则必须更新与组织相关的所有用户以反映新名称。在我的真实场景中,有更多的表格可以存储organization_name

问题:目前我只是异步启动更新语句,如果它中途失败,那么我最终会得到不一致的数据

问题:如何处理此类问题是否有最佳做法?

可能的解决方案

  • 使用BATCH语句。但我发现它非常有限,因为默认它只允许50kb的查询大小(在我的情况下,1更新可能导致更新来自两个或三个不同表的8,000个其他实体,在字段值中具有不同的长度 - 因此查询大小相当不可预测)
    • 我实际上尝试使用BATCH语句来更新100个项目(需要更新的600个项目),并且因“批量大小太大”异常而失败...
  • 重试失败时重试

PS - 我的行不是太宽,最多每个表大约有20列

更新

忘记添加,这是一个需要尽快反映更新的webapp,因此批处理作业将不适用

更新2:

关于读取模式,我当前的示例过于简单,但无论如何我都需要获取用户列表(它可能来自多个组织) - 这可能会使数百个组织的数千名用户返回,这就是我存储的原因organization_name表格中的users我的理解是,使用Cassandra数据非规范化是要走的路

2 个答案:

答案 0 :(得分:3)

与每个长期运行的更新过程一样,您应该使用书签的概念:

  • 运行(例如100个)异步更新的作业,然后存储刚刚更新100行的某个地方。
  • 运行另外100行的另一个作业,然后将刚刚更新的200行添加为书签。
  • 依旧......

如果发生崩溃,您只需通过阅读书签即可恢复崩溃的位置。

要执行此类任务,您必须已经知道必须更新哪些记录,但我假设您已经了解它们或知道如何检索该信息。

答案 1 :(得分:2)

尝试使用分页。大多数司机都支持它。

1)从users表接收更新结果,每页分页x行。

2)为页面中的每条记录运行异步更新。

3)转到下一页。