在Cassandra上使用计数器处理自动增量ID的方法?

时间:2014-01-18 16:27:32

标签: cassandra cql cql3 cassandra-2.0

这不是关于在Cassandra上使用主键自动增量整数而不是UUID的问题,在这种情况下我想在Cassandra上生成像PostgreSQL这样的自动增量效果,不需要一定是可扩展的。我正在使用UUID作为表中条目的主键,但我需要为这些条目生成一个像bitly一样的shortid。所以我开始尝试创建一个应用程序来抓取特定条目的索引,并根据该索引生成一个shortid,然后将shortid设置为条目。

所以我想在Cassandra上做这样的事情:

CREATE TABLE photo (
   id uuid,
   shortid text,
   title text,
   PRIMARY KEY (id)
);

CREATE TABLE shortid (
  shortid text,
  family text,
  longid uuid,
  index bigint,
  created_at timestamp,
  PRIMARY KEY ((shortid, family))
) WITH COMPACT STORAGE;

CREATE TABLE shortid_reverse (
  longid uuid,
  family text,
  shortid text
  PRIMARY KEY ((longid, family))
) WITH COMPACT STORAGE;

CREATE TABLE shortid_last_index (
  family text,
  last_index counter,
  last_long_id uuid,
  PRIMARY KEY (family)
);

所以在这个将处理shortid的应用程序中,当应用程序启动时它将获得该系列的最后一个索引,然后它将增加应用程序本身的值,因为此应用程序将在Nodejs和Nodejs上运行可以扩大规模。

的application.js

var index = lastIndexFromCassandra++ //5
  , hashids = new Hashids("this is my salt")
  , shortid = hashids.encrypt(index); //dDae3KDDj4Q

在应用程序增加索引并生成shortid后,它将继续存在于Cassandra:

UPDATE shortid_last_index SET last_index = last_index+1, last_long_id = fabac1f0-7f88-11e3-baa7-0800200c9a66 WHERE family = 'photo';

INSERT INTO shortid (shortid, family, longid, index, created_at) VALUES ('dDae3KDDj4Q', 'photo', fabac1f0-7f88-11e3-baa7-0800200c9a66, 5, NOW());

INSERT INTO shortid_reverse (longid, family, shortid) VALUES (fabac1f0-7f88-11e3-baa7-0800200c9a66, 'photo', 'dDae3KDDj4Q');

UPDATE photo SET shortid = 'dDae3KDDj4Q' WHERE id = fabac1f0-7f88-11e3-baa7-0800200c9a66;

所以,实际上没有更好的方法在Cassandra中这样做而不创建一个只会这样做的应用程序?我不能在Cassandra上做类似PostgreSQL的事情:

UPDATE shortid_last_index SET last_index = last_index+1, last_long_id = ? WHERE family = 'photo' RETURNING last_index;

相比之下,如果上面的语句有效,它可能会锁定行,但是增加并抓住应用程序本身的索引然后安全地增加Cassandra中的计数器也不会锁定行?应用程序的规模如何?

1 个答案:

答案 0 :(得分:0)

如果您需要短增量ID生成,请查看Snowflake或其他无数克隆/灵感之一。

你试图做的事情是关于多重计数的坏主意。