/superagent-load-balancer

load balacner plugin for superagent

Primary LanguageJavaScriptMIT LicenseMIT

superagent-load-balancer

Build Status Coverage Status npm Github Releases

Load balancer plugin for superagent

Installation

$ npm install superagent-load-balancer

Examples

View the ./examples directory for working examples.

API

get

  • backends the backend list

    • name The name of backend

    • host The host of backend

    • protocol The protocol, optional, default is 'http'

    • ip The ip of backend, optional

    • port The port of backend, optional

    • weight The weight of backend, it is for 'round-robin'

    • backup Set the backend as backup, optional

  • type balance algorithm: url, leastconn, round-robin, first, url-path, default is round-robin

const request = require('superagent');
const Balancer = require('superagent-load-balancer');
const balancer = new Balancer([
  {
    host: 'domain.com',
    ip: '192.168.1.1',
    port: 8080,
    weight: 10,
  },
  {
    host: 'domain.com',
    ip: '192.168.1.2',
    port: 8080,
    weight: 2,
  },
]);
const plugin = balancer.plugin();

request.get('/user')
  .use(plugin)
  .then((res) => {
    console.info(res.body);
  })
  .catch(console.error);

startHealthCheck

  • options {ping: function, interval: ms}

    • ping ping function, the function will return promise. If resolve, the backend is healthy. If reject, the backend is sick.

    • ms check interval

    • window each check the total count of ping

    • threshold each check the healthy count is bigger than threshold, the backend is healthy. Otherwise is sick

const request = require('superagent');
const Balancer = require('superagent-load-balancer');
const balancer = new Balancer([
  {
    host: 'domain1.com',
    weight: 10,
  },
  {
    host: 'domain2.com',
    weight: 2,
  },
]);
const ping = (backend) => {
  const url = `http://${backend.host}/ping`;
  return request.get(url).timeout(300);
};
balancer.startHealthCheck({
  ping,
});

const plugin = balancer.plugin();

request.get('/user')
  .use(plugin)
  .then((res) => {
    console.info(res.body);
  }).catch(console.error);

on

Add listener function to healthy, sick, hit event

const request = require('superagent');
const Balancer = require('superagent-load-balancer');
const balancer = new Balancer([
  {
    host: 'domain1.com',
    weight: 10,
  },
  {
    host: 'domain2.com',
    weight: 2,
  },
]);
const ping = (backend) => {
  const url = `http://${backend.host}/ping`;
  return request.get(url).timeout(300);
};
balancer.startHealthCheck({
  ping,
});

balancer.on('healthy', (server) => {
  console.info(server);
});
balancer.on('sick', (server) => {
  console.info(server);
});
balancer.on('hit', (server) => {
  console.info(server);
});

const plugin = balancer.plugin();

request.get('/user')
  .use(plugin)
  .then((res) => {
    console.info(res.body);
  }).catch(console.error);

getAvailableServers

Get the available server list, which isn't disabled and backup.

const request = require('superagent');
const Balancer = require('superagent-load-balancer');
const balancer = new Balancer([
  {
    host: 'domain1.com',
    weight: 10,
  },
  {
    host: 'domain2.com',
    weight: 2,
    backup: true,
  },
]);
const ping = (backend) => {
  const url = `http://${backend.host}/ping`;
  return request.get(url).timeout(300);
};
balancer.startHealthCheck({
  ping,
});
// [ { id: '51d27b36cb9c34ff', host: 'domain1.com', weight: 10 } ]
console.info(balancer.getAvailableServers());

addAlgorithm

Add the custom load balance algorithm

  • name The algorithm's name

  • fn The algorithm, it should return an integer.

const request = require('superagent');
const Balancer = require('superagent-load-balancer');
const balancer = new Balancer([
  {
    host: 'domain1.com',
  },
  {
    host: 'domain2.com',
  },
], 'getByUrl');
balancer.addAlgorithm('getByUrl', (request) => {
  return request.url.length;
});

const plugin = balancer.plugin();

request.get('/user')
  .use(plugin)
  .then((res) => {
    console.info(res.body);
  })
  .catch(console.error);

License

MIT