3

我阅读了很多 Cassandras 文档并检查了 Counter 的更改等。但很明显,Cassandra 没有提供默认和标准的方式来动态生成增量序列。

我发现的只是通过比较和设置来使用 IF 语句/子句。

这种方式可以检查文档是否存在,如果不存在则生成一个。由于这是通过将集群视为集群的仲裁算法完成的,因此它应该易于使用且安全,但延迟很高。

为了避免这种延迟,可以通过将 nextSequenceId 增加一千而不是一来生成(保留)一千个 ID。这样一来,只有在生成一千个中的第一个时才为延迟付费(或者如果它过早完成,它将几乎没有延迟)。

我知道这样做会造成热点或拥堵。

避免这种拥塞的一种方法是使用更多的序列号生成器,它们都具有不同的偏移量(模数),并通过选择模数随机选择某个序列生成器来限制冲突的机会。

所以这将是我天真的实现。

自从 Cassandra 3.0 上市以来,我只想知道三件事:

  1. Cassandra 是否提供了一种更智能的实现序列的方式。
  2. Cassandra 是否提供了一些东西来减轻实现这一点的痛苦?我的意思是我做一个阅读,而不是我比较和设置。有什么更聪明的吗?
  3. 是否存在任何图书馆已经给了我一种序列号?
4

1 回答 1

2

乔纳森为此主题打开了一个 Jira - https://issues.apache.org/jira/browse/CASSANDRA-9200

3.0 尚未发布,但似乎提交者正在完成 3.0 的功能,并且似乎为 3.1 设置了 9200(这实际上意味着“3.0 之后的某个时间”——可能是 3.1、可能是 3.2、可能是 4.0)。

对于您的问题:

1) 不,目前没有内置的方式在 cassandra 中进行排序

2)不,如果您可以容忍不严格增加的序列,您将不得不先读后写,或者阻止每个节点的序列部分

3) Twitter 曾一度发布过 Snowflake ( https://github.com/twitter/snowflake ),但现在已停用。通常,我倾向于使用 1 类 UUID,它是基于时间戳的随机组件。即使 UUID 也不是万无一失的,但对于我们的工作负载来说,它们往往“足够好”。Simpleflake ( http://engineering.custommade.com/simpleflake-distributed-id-generation-for-the-lazy/ ) 在我提供的链接上讨论了权衡,并且还提供了他们自己的生成器。

于 2015-04-27T04:06:03.070 回答