【问题标题】:Insert incremental serial number in cassandra table在 cassandra 表中插入增量序列号
【发布时间】:2020-11-04 21:09:41
【问题描述】:

我使用 Cassandra 作为数据库,我想为每条记录以顺序形式为每条记录插入一个序列号,这样每条记录都是唯一的。 这样即使应用程序崩溃,重新启动后如果插入任何记录,则序列号是最新的。 我一直在寻找它,但没有找到任何适用于 Cassandra 的解决方案。

我想到的解决方案是获取表的count(*),然后插入值增加1的记录。但是获取count似乎不是一个好方法,因为超时记录的数量会高得多。

【问题讨论】:

  • 这可能会有所帮助stackoverflow.com/questions/3935915/…
  • 今天向我的新工程师和实习生指出这个问题,因为这带来了几个关于分布式系统如何工作(和不工作)的好讨论点。跨度>

标签: java spring cassandra


【解决方案1】:

尝试在 Cassandra 中创建这样的顺序键并不是一个好主意,因为 Cassandra 是一个高度可用的分布式数据库,通常会牺牲一致性来保证可用性。由于一致性问题,“写前读”(获取计数(*)然后插入记录)在 Cassandra 中被视为反模式。根据读取修改数据是不安全的,因为在读取期间该数据可能已被另一个进程更改。

一个可行的解决方案是使用 TimeUUID。如果生成正确,ID 将是唯一的,而且还可以按时间排序。检查https://cwiki.apache.org/confluence/display/CASSANDRA2/TimeBaseUUIDNotes 了解更多信息。还有很多关于如何创建 TimeUUID 的答案。

【讨论】:

  • 此外,Cassandra 插入和更新被捆绑到“upserts”中,因此尝试创建具有先读后写的唯一键的潜在结果是,如果两个进程写入,数据将被完全覆盖具有非唯一 ID 的记录
猜你喜欢
  • 2016-07-06
  • 2013-03-09
  • 1970-01-01
  • 2017-06-28
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多