recluster

Node clustering library with support for zero downtime reloading

  • Owner: doxout/recluster
  • Platform:
  • License::
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

recluster

Clustering library with support for zero-downtime reloading

usage

If server.js is your regular http server (e.g. express), create
cluster.js and add:

var recluster = require('recluster'),
    path = require('path');

var cluster = recluster(path.join(__dirname, 'server.js'));
cluster.run();

process.on('SIGUSR2', function() {
    console.log('Got SIGUSR2, reloading cluster...');
    cluster.reload();
});

console.log("spawned cluster, kill -s SIGUSR2", process.pid, "to reload");

then run it

node cluster.js

To hot-reload the server, simply run

kill -s SIGUSR2 <cluster_pid>

To find out which of the N (= number of cores by default) worker
instances you're running from inside server.js, you can use

process.env.WORKER_ID

which is zero-based i.e. 0 <= WORKER_ID < N

options

var cluster = recluster(file, opt)

where

file

Absolute path to the module that defines the server

opt.workers

Number of active workers (default = cores)

opt.timeout

Timeout to kill old workers after reload (seconds).

Defaults to 1 second in development, 1 hour in production.

opt.respawn

Minimum time between worker respawns when workers die (seconds)

opt.backoff

Maximum respawn time (reached via exponential backoff). Set to
0 or undefined to disable exponential backoff.

opt.readyWhen

Use 'listening' for servers (e.g. for express/connect http servers)
and 'started' for workers that are immediately ready.

If you want to manually tell recluster when the worker is ready to replace
older workers you can use {readyWhen: 'ready'}. Then, to signal readiness
from the worker use process.send({cmd: 'ready'})

opt.args

Array of arguments to pass to the worker

opt.log

Log various events to stdout. Currently only 'respawns' is supported.
Default: {respawns: true}

opt.logger

Which logger to use. Requires a console-compatible log method
Default: console

cluster

The returned object has the following methods:

cluster.run

Starts the cluster by running child processes

cluster.reload(cb)

Hot-reloads new code. some of the children will remain active
for opt.timeout seconds after reload

cluster.terminate(cb)

Terminates the entire cluster and removes all listeners.

cluster.activeWorkers()

Returns a hash of all worker slots (0 <= WORKER_ID < N). If a worker isn't
available at that slot, the value in the hash is null or undefined. Otherwise,
the value will be a worker object that is ready to serve requests.

cluster.workers()

Returns an array of all the workers, including those that are not
yet ready or those that will be replaced.

worker cleanup

A server worker can gracefully exit by cleaning up in the 'close' event
of its server:

server.on('close', function() {
    // cleanup
});

Non-server workers can listen for the disconnect command and shut down
gracefully before the kill timeout:

process.on('message', function(m) {
    if (m.cmd == 'disconnect') {
        // cleanup
    }
})

sticky sessions support

If you need sticky sessions e.g. for socket.io you can use the experimental
companion module sticky-listen, which implements an alternate
balancer that distributes the sockets based on the client IP (instead of the
regular round-robin one)

Bitdeli

Main metrics

Overview
Name With Ownerdoxout/recluster
Primary LanguageJavaScript
Program languageJavaScript (Language Count: 1)
Platform
License:
所有者活动
Created At2013-04-02 17:58:11
Pushed At2021-04-15 13:05:59
Last Commit At2021-04-15 14:05:52
Release Count0
用户参与
Stargazers Count522
Watchers Count17
Fork Count44
Commits Count109
Has Issues Enabled
Issues Count39
Issue Open Count11
Pull Requests Count10
Pull Requests Open Count0
Pull Requests Close Count5
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private