【问题标题】:Update and read a counter in Cassandra, what is the correct approach?更新并读取 Cassandra 中的计数器,正确的方法是什么?
【发布时间】:2016-04-18 10:26:55
【问题描述】:

在 Cassandra 中读取更新的计数器值的最佳方法是什么?假设从我的应用程序中我需要更新一个计数器,然后使用它的更新值。所以我有两个查询,第一个更新计数器,下一个读取它。据我了解,由于数据的复制,无法保证读取查询将获得更新的计数器。所以据我所知有两种方法:

  1. 使用一致性级别 ALL 更新计数器,然后读取它。但我不确定此操作会对性能产生什么影响?

  2. 在更新之前读取计数器值,然后更新它。然后将读取的值加 1 并使用它。现在我没有发现这种方法有任何问题?

或者可能有其他方法和其他一些我没有考虑的因素?

无论如何,我很乐意了解最佳做法是什么?

【问题讨论】:

  • 对上述内容有任何更新或答案吗?如果是这样,请分享,因为我现在在同一条船上..

标签: cassandra-2.0 datastax


【解决方案1】:

据我了解,由于数据的复制,无法保证读取查询将获得更新的计数器。

问题更多是关于计数器的分布式设计。请参阅下面的时间线

初始计数器值 = 0

  1. t1。客户端 A 递增计数器 +5
  2. t2。客户端 B 递增计数器 +3

如果客户端A在t2之前读回计数器值,它将看到counter = 5

如果客户端A在t2之后读回计数器值,它将看到counter = 8 (+5 +3)

如果在您回读计数器值时,其他人是否已更新它,您现在就无法做到。使用轻量级事务 (LWT) 使计数器更新线性化不是一种选择,因为计数器表不支持 LWT。

也许您应该描述您的用例,以便我们可以设计出合适的方法。你想用计数器做什么?您希望创建哪些类型的查询来读取您的计数器?

【讨论】:

  • 同样的问题:我们场景中的计数器被用作另一个表中技术流程的唯一运行编号。一旦必须将一个新条目写入另一个表,它就需要这个新数字,该数字必须首先在计数器表中递增。
【解决方案2】:

正如@doanduyhai 解释的那样,当并发客户端同时增加计数器时,您的两种方法都容易出错。 这是我们设计中的一个问题,我们使用 counters 表作为其他表的键,所以我们需要唯一的 id。是的,我们知道我们可以将 UUID 用于唯一 ID,但我们希望保持键的排序并在客户端上易于阅读。 我们的解决方案:

v1 = 读取计数器 A。

-增加计数器 A。

v2 = 再次读取计数器 A。

如果v2 == v1+1,那么进程是单独的或者是第一个,用计数器算了。

如果不是,是多个进程竞争的信号,所以:

随机休眠(因此每个进程休眠的时间不同,并且不会永远竞争),然后再试一次完整的循环。

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多