superagent-load-balancer

load balancer plugin for superagent

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
superagent-load-balancer
602.0.37 years ago8 years agoMinified + gzip package size for superagent-load-balancer in KB

Readme

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 or sick 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);
});

const plugin = balancer.plugin();

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

getAvailableServers

Get the available server list. It is not 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