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

可靠地更新Cassandra中大量行的最佳实践(关系更新),cassandra,Cassandra,我有几个相互关联的表,看起来像这样: organizations: - id - name - ... other fields users: - id - name - organization_id - organization_name - ... other fields 我在users表中保留organization\u name字段,这样它就不必查找organization来获取组织名称 问题是,如果更改了组织名称,则必须更新与该组织相关的所有用户以反映新名称。在我的真实场景中

我有几个相互关联的表,看起来像这样:

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

users:
- id
- name
- organization_id
- organization_name
- ... other fields
我在
users
表中保留
organization\u name
字段,这样它就不必查找organization来获取组织名称

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

问题:目前,我只是异步启动update语句,如果中途失败,那么我将得到不一致的数据

问题:是否有处理此类问题的最佳做法

可能的解决方案

  • 使用
    BATCH
    语句。但我发现它非常有限,因为默认情况下它只允许50kb的查询大小(在我的情况下,1次更新可能会导致从两个或三个不同的表中更新8000个其他实体,字段值的长度不同,因此查询大小相当不可预测)
    • 实际上,我尝试使用
      BATCH
      语句更新100个项目(需要更新的600个项目中的100个),但由于“批大小太大”异常而失败
  • 更新失败时重试
PS-我的行不是太宽,每个表最多有20列


更新:

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


更新2:


关于读取模式,我当前的示例过于简单,但在任何情况下,我都需要获取用户列表(可以来自多个组织)-这可能会返回数百个组织中的数千个用户,这就是我将
组织名称
存储在
用户
表中的原因,因为我的理解是,使用Cassandra数据反规范化是一种方法

就像在每个长时间运行的更新过程中一样,您应该使用书签的概念:

  • 运行(比如100)个异步更新的作业,然后将其存储在刚刚更新100行的位置
  • 运行另外100行的作业,然后将刚刚更新的200行添加到书签中
  • 等等
在崩溃的情况下,您只需通过阅读书签恢复崩溃的位置


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

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

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

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


3) 转到下一页。

您的阅读模式是什么?为什么要避免按用户查找组织名称?如果您想显示关于一个用户的信息,最好有一个额外的请求来获取组织名称,而不是支持多个表之间的一致性。@MikhailBaksheev I更新了问题以包含更多详细信息。我同意如果为一个用户显示,那么存储组织名称是没有意义的:-)您将通过哪个字段获取用户?或者所有用户?我的回答是:“以X组记录的形式更新所有记录。选择X以最好地反映您的需求。连续运行多个‘组更新’,就像您应该一次更新所有记录一样,但只需将每个组添加到书签,以便在出现问题时能够继续。”这不是“尽快”吗?没有批次,只是异步的。并将查询设计为幂等,以便可以一次又一次地运行它们。。。