Skip to content

LCMApps/consul-leader-election

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Example of usage

const Consul = require('consul');
const {LeaderElection} = require('./index.js');

const consul = new Consul({
    host: '127.0.0.1',
    port: 8500,
    promisify: true //required
});

const sessionOptions = {
    dc: 'dc1',
    name: 'Session name',
    node: 'some.local.host',
    ttlSec: 30, //30 seconds, not settled by default
    lockdelaySec: 5, //5 seconds, default=15
    checks: ['serfHealth', 'my-check-id'] //only 'serfHealth' by default
};

const kvOptions = {
    key: 'service/vsscc/leader', //required
    value: 'some value', //require
    dc: 'dc1',
    json: true //parse KV value on record change
};

let leader = false;

const leaderElectionService = new LeaderElection(consul, sessionOptions, kvOptions);

leaderElectionService.on(LeaderElection.ELECTED_EVENT, async (amILeader, sessionId) => {
    if (amILeader) {
        if (leader) {
            console.log('Leadership was reacquired by myself. Maybe, I am only one candidate )');
        } else {
            console.log('I\'m the leader');
            leader = true;
        }
    } else {
        if (leader) {
           const sessionInfo = await consul.session.get(sessionId);
           console.log(`${sessionInfo.Node} is a leader now`);
        } else {
           console.log('Not today...');
        }
    }
});

leaderElectionService.on(LeaderElection.LOST_LEADER_EVENT, () => {
    if (leader) {
       leader = false;
       console.log('I have lost my leadership =(');
    }
});

leaderElectionService.on(LeaderElection.UNHEALTHY_EVENT, () => {
    if (leader) {
        leader = leaderElectionService.isLeader(); //set to false, because leadership can't be confirmed  
        
        // pause processing or so on
    }
});

leaderElectionService.on(LeaderElection.ERROR_EVENT, error => {
    console.error(error);
});

await leaderElectionService.start();

const value = leaderElectionService.getElectionKeyValue();
const rawData = leaderElectionService.getElectionKeyData();

setTimeout(async () => {
    await leaderElectionService.resign();
    process.exit(0);
}, 10000);

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •