Thank you ted for your solution. I think I will implement this one too along with the one mahadev suggested. The ids will be long lived, they are used to uniquely identify documents in our system. The way I was using the ephemeral ids in my simplistic solution was to create a node and then immediately delete it after grabbing the ephemeral Id off it.

Sent from my iPhone

On Apr 23, 2009, at 6:28 PM, Ted Dunning <> wrote:

I don't think you meant ephemeral nodes because it isn't very likely that you would have more than a billion sessions attached to a single zookeeper cluster. If you simply want to have a guaranteed unique value among all live owners of these id's, then ephemeral sequential nodes are fine and
integers are also probably fine.

If you want longer-lived uniqueness, then you need something stronger. If your required rate of generating these values is relatively low, then you can keep the current maximum (long) value of an id in a file on Zookeeper.
When you need to generate a new id, do this:

   public long nextId(String state) throws InterruptedException,
KeeperException {
       Stat s = new Stat();
       boolean committed = false;
       long id = 0;
       while (!committed) {
ByteBuffer buf = ByteBuffer.wrap(zk.getData(state, false, s));
           id = buf.getLong();
           try {
               zk.setData(state, buf.array(), s.getVersion());
               committed = true;
           } catch (KeeperException.BadVersionException e) {
               committed = false;
           } catch (InterruptedException e) {
// at this point, we don't know that our update happened.
Since it is
// not a problem to redo this and because this situation
should be extremely
               // rare, we will just pretend the update failed.
               committed = false;
       return id;

This gives you long id's that will not repeat. It will be somewhat limited in the number of id's you can create per second, especially if you have thousands of nodes all asking for id's. You could increase that rate by
randomly selecting one of *n* files each of which corresponds to an
different disjoint region in the id space. Even so, with a good zookeeper cluster, you should be able to generate 10,000 id's per second or more.

Another way to substantially increase the id generation rate would be to allocate 1000 id's per call to zookeeper. You give up on consecutive id's
with that approach, but you should be able to generate millions of
guaranteed unique id's per second and these id's should be pretty dense if
each process generates lots of id's.

On Thu, Apr 23, 2009 at 4:52 PM, Satish Bhatti <> wrote:

We currently use a database sequence to generate unique ids for use by our application. I was thinking about using ZooKeeper instead so I can get rid
of the database.  My plan was to use the sequential id from ephemeral
but looking at the code it appears that this is an int, not a long. Is
there any other straightforward way to generate ids using ZooKeeper?


Reply via email to