/consul-leader

Consul leader election and retirement.

Primary LanguageJavaScriptMIT LicenseMIT

consul-leader

Consul leader election and retirement.

https://www.consul.io/docs/guides/leader-election.html

Usage

npm install --save consul-leader
const Leader = require('consul-leader');

let consulLeader = new Leader('locking-key');
consulLeader.on('elected', () => {
    // start service
});

consulLeader.on('retired', () => {
    // stop service
});

Leader

Configuration

No configuration is required, but it's recommended to provide at least a custom key name.

let consulLeader = new Leader('locking-key');

It's possible to configure every aspect (consul, session, key) by providing a configuration object instead of a plain string. Most aspects match the configuration options of the consul package.

let consulLeader = new Leader({
    consul: {
        host: '127.0.0.1',
        port: 8500
    },
    session: {
        ttl: 10,
        lockdelay: 15
    },
    key: {
        key: 'locking-key',
        value: 'leader'
    }
});

The consul configuration matches the consul constructor options. Note: the promisify option is required and will be automatically enabled in this package.

The session configuration matches the consul session create options. But the ttl and lockdelay options have to be integers in seconds.

The key configuration matches the consul kv set options. The acquire and release options are automatically added, overwriting them will lead to unexpected behaviour.

Events

The Leader class will automatically try to acquire the leader lock and emits two different events:

  • elected: Will be fired when the current instance has acquired the leader lock successfully
  • retired: Will be fired when the current instance has lost the leader lock
consulLeader.on('elected', () => {
    // start service
});

consulLeader.on('retired', () => {
    // stop service
});

Resign

If the current instance wants to stop, it can release the lock safely and give others the chance to take over.

consulLeader.resign();