An even simpler library for locking with ZooKeeper based on node-zookeeper-client

This locking library is based on the ZooKeeper lock recipe with one key difference: the lock nodes it creates are ephemeral.

The ZK lock recipe recommends negotiating for the lock under the requested lock node with child nodes like _locknode_/guid-lock-<sequence number>. However, ephemeral nodes may not have children, and non-ephemeral state reduces zookeeper's partition resilience. The operators of applications with a large number of unique locks, especially a monotonically increasing number of locks (as when locking on a unique timestamp), will suffer zookeeper issues in production. zk-ultralight is meant to provide locking with less production impact.

function somethingAsyncHappens(callback) {
  var cxn = zkultra.getCxn(settings.ZOOKEEPER_URLS);
    cxn.lock.bind(cxn, '/some/lock/i/need', process.title +'-'+ process.pid),
    cxn.unlock.bind(cxn, '/some/lock/i/need')
  ], callback);

bin/non-ephemerals.js prints a JSON array of the non-ephemeral nodes (which have a mtime less than --since milliseconds in the past) in your zookeeper cluster to stdout. You can run it in the vm after running the test suite to see the non-ephemerals left after the tests:

$ bin/non-ephemerals.js /

Default for --since is two weeks, so this example shows only znodes with mtimes in the last two weeks.

bin/rm-znodes.js accepts a JSON array of znodes on stdin and removes them from your zookeeper cluster. The usual usage will be bin/non-ephemerals.js / | bin/rm-znodes.js to remove all not-recently-used non-ephemeral nodes without children. Sequential runs will eventually remove all znode subtrees which do not contain ephemeral nodes.

The Vagrantfile ships a vm with a running zookeeper instance, which is all you need to run tests.

npm test

Optionally, the zookeeper server and port can be given with:

ZK=$(docker-machine ip zk):2181 npm run test

npm run-script lint

npm run-script coverage


Library is distributed under the Apache license.