zk-ultralight

0.3.1 • Public • Published

travis

What's so special about this zookeeper locking library?

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.

Usage

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

bin/

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 /
[
  "/plum",
  "/dog",
  "/foo/bar",
  "/plumber",
  "/111",
  "/apple",
  "/cat"
]

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.

Development

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

Tests

npm test

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

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

Lint

npm run-script lint

Coverage

npm run-script coverage

License

Library is distributed under the Apache license.

Package Sidebar

Install

npm i zk-ultralight

Weekly Downloads

4

Version

0.3.1

License

none

Last publish

Collaborators

  • rchiniquy
  • rphillips