我们应该使用 Cassandra NoSQL 计数器还是 LWT 来生成自动增量整数键?

Should we use Cassandra NoSQL counter or LWT for auto incremental integer key generation?

我们想在Cassandra中生成自增整数键。这在传统数据库中是微不足道的任务,但在 Cassandra 中并不复杂。

我尝试了可以​​使用

递增的计数器数据类型
value=value+1

并尝试使用

的 LWT
UPDATE myTable SET value=newValue  IF value=oldValue.
(where newValue=oldValue+1 for auto increment)

我被强烈警告不要使用反变量。我不确定为什么。能否请您帮助我了解上述两种方法的优缺点?

从免责声明开始, 您很可能不希望在 C* 中使用自动递增的整数键。更有可能的是 UUID 或 TimeUUID 是您想要的。但是,如果您确实碰巧确实需要一个自动递增的值,请继续阅读。

状态和分布式系统不喜欢混合。通常,只要你想 'really' 确定你的分布式系统的状态,你就必须检查所有副本,从而牺牲 availability/partition 容忍度。 LWT 使用 Paxos 来允许检查和设置操作,但要做到这一点,它们需要一定数量的节点,并且比正常的 Cassandra 操作慢得多。 LWT 应该只用于应用程序中使用的一小部分操作。只要对计数器变量的争用很少,并且您不需要每次写入都需要它,就可以了。

C* 中的计数器是一个非常不同的实现。在旧版本的 C* 中,它们因无法跟踪值而臭名昭著。它们的实现已被重写以大大提高稳定性,但需要在应用程序方面进行仔细规划以保证独特的操作。您可以想象两个客户端同时增加一个计数器,每个客户端都认为他们收到了一个唯一的值。因此,如果您真的需要确保唯一性,我认为您应该使用 LWT。