【问题标题】:Multiple requests handling in CassandraCassandra 中的多个请求处理
【发布时间】:2017-10-26 01:38:23
【问题描述】:

我正在使用 cassandra。

我有两个列族 A 和 B。两个列族都有相同的数据,但都有不同的主键。现在我正在使用批处理语句来更新这两个表中的行。

表架构如下:

表A的主键[id1(partition key) id2(partition key) id3(clustering key)]

表B的主键[id1(partition key) id2(partition key) state(clustering key) id3(clustering key)]

我想更新两个表的状态。 State 是 B 中的集群键,在表 A 中是简单的列。

我所做的是从 A 获取状态并将其视为旧状态。

然后批量我做的是首先从表A中删除行,然后从表B中删除行,在表A中插入新行并在表B中插入新行。

注意:使用从 A 获取的旧状态,我创建 B 的主键,然后从 B 中删除并在 B 中插入新行。

它工作正常,但对于并行请求却不是。 如果来自 2 个不同实例的 2 个请求来自相同的主键,那么我遇到了问题。表 B 获取新旧状态的两个条目。

那么我该如何在 cassandra 中解决这个问题?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    Cassandra 2.0 及以上版本支持轻量级事务。

    您在插入时遇到“IF NOT EXISTS”条件。

    在你的情况下,当你从表 A 中获取状态时你不能检查它,但是你可以在插入时限制它,这在你的情况下不允许重复。例如。

    insert into A(id1, id2, state, id3)
    values('val1', 'val1', 'val3', 'val4')
    IF NOT EXISTS
    

    所以第一个执行的会通过,但第二个会失败。因此,请根据您的业务需求处理来自客户的重试/任何故障机制。

    查看此文档了解更多信息:https://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 2012-04-02
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多