• Stars
    star
    162
  • Rank 232,284 (Top 5 %)
  • Language
    JavaScript
  • Created about 11 years ago
  • Updated over 9 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

zero downtime re-deploys with Node.js

SYNOPSIS

Safe code hotswap for zero downtime re-deploys.

BUILD STATUS

Build Status

MOTIVATION

An application in production should not need to be stopped in order to utilize new code.

DESCRIPTION

liveswap is a library that helps you update an application’s code without stopping it. It also ships with a command-line tool and it doesn’t impose any special requirements or conventions on your application code.

It works by creating a light-weight master process that runs your application code as worker processes. It then starts listening for instructions.

When you send an upgrade instruction, workers take turns disconnecting their underlying servers. When a server is disconnected, it lets the old connections finish up, but no new connections are accepted. When all of the worker’s connections have been closed, it will be retired and a new one will be created using the new code. For more in depth information read this blog post.

USAGE

Install

npm install liveswap -g

Example

Using the node.js hello world example, in a filed named index1.js...

First Version (Sample Code)

var http = require('http')
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'})
  res.end('Hello World\n')
}).listen(1337, '127.0.0.1')
console.log('Server running at http://127.0.0.1:1337/')

Startup

Start the application using liveswap from the command-line...

liveswap -s index1.js

Alternatively, start liveswap programmatically...

var liveswap = require('liveswap')
liveswap('./index1.js')

Second Version (Sample Code)

Now we have an updated version of the code in index2.js...

var http = require('http')
http.createServer(function (req, res) {
  res.writeHead(404, {'Content-Type': 'text/plain'})
  res.end('Not Found\n')
}).listen(1337, '127.0.0.1')
console.log('Server running at http://127.0.0.1:1337/')

Live Update

Update the current code by sending an update command to the server.

liveswap -u ./index2.js

After sending an update message the worker processes will wait for any current connections to end before restarting with the new code.

CLI Options

Options:
  -p, --port     <port> specify the liveswap server port.                      [default: 3000]
  -a, --address  <address> specify the ip address to run on.                   [default: "127.0.0.1"]
  -f, --forks    <number> specify how many worker processes to spawn           [default: 2]
  -u, --upgrade  [<path>] specify the source code to upgrade to.
  --pre-upgrade  <path> a module to handle pre upgrade logic.
  -k, --kill     kill all forked worker processes and respawn.
  -d, --die      kill all forked worker processes and quit master process.
  -m, --message  <message> send a message to all the forked worker processes.
  -s, --start    <path> start a node process cluster.
  -H, --head     <path> path to HEAD file
  -z             disable zero-downtime, upgrade will kill processes
  -v, --version  print program version and exit

Pre-upgrade allows you to require a module that will be executed before each time the upgrade happens.

liveswap --pre-upgrade ./pull.js --start ./index1.js

The pre-upgrade module should export a single function as its interface. Here's an example of what that module might look like:

function preupgrade(data, callback) {
  console.log('executing pre-upgrade script...');

  var err, value = data.value;
  try {
    // execute pre-upgrade code
  } catch (e) {
    err = e.toString();
  }

  callback(err, value);
}
module.exports = preupgrade;

API

liveswap(opts)

The main export of this library accepts an options object or a string. If a string is specified, it will be interpreted as the target option.

[option] { target: <String> }

[option] { port: <Number> }

[option] { address: <String> }

[option] { forks: <Number> }

[option] { head: <String> }

[option] { 'pre-upgrade': <String> }

[option] { 'zero-downtime': <Boolean> }

liveswap({
  target: './index.js',
  port: 9008,
  address: '0.0.0.0',
  forks: 2,
  head: '/tmp/HEAD',
  'pre-upgrade': './pull.js',
  'zero-downtime': false
})

More Repositories

1

levelui

A GUI for LevelDB management based on atom-shell.
CSS
723
star
2

lev

The complete REPL & CLI for managing LevelDB instances.
JavaScript
296
star
3

node-chrome

deprecated
JavaScript
281
star
4

cdir

An interactive console.dir() for node.js similar to console.dir() in webkit.
JavaScript
269
star
5

prompt-sync

a synchronous prompt for node.js
JavaScript
217
star
6

ldb

A C++ REPL / CLI for LevelDB
C++
201
star
7

cxx-http

A simple http library in c++ backed by libuv and http-parser.
C++
183
star
8

complete

Does your Node.js command line program have lots of arguments? Add custom tab completion!
JavaScript
165
star
9

codesurgeon

[DEPRECATED] Build a subset or superset of a javascript codebase via reading the AST.
JavaScript
163
star
10

Porter

Resource oriented abstraction layer for JSON-REST
JavaScript
156
star
11

EventVat

An evented, in-process key/value store for small volatile working sets in Node.js or the Browser
JavaScript
111
star
12

prohub

A Project Perspective for Github
CSS
90
star
13

paramify

Parameterized routes without a big bloated router, e.g. "showtimes/:start/:end" and "files/*"
JavaScript
84
star
14

gmm

Git Module Manager - http://gitmodules.org
Shell
78
star
15

blog

personal blog
HTML
73
star
16

level-replicator

WIP; Eventually consistent log-based multi-master replication for levelDB (@Level)
JavaScript
70
star
17

JUP

A fast JSON to Markup Engine
JavaScript
62
star
18

jsgit-stream

JavaScript
62
star
19

txl

All your html templating needs in under 10 lines of JS.
JavaScript
62
star
20

logmap

Filter json streams/logging output using JSONSelect and format the output
JavaScript
59
star
21

tsd

spins up a server to receive time-series data via tcp streams and then graphs it in the browser via web-sockets
JavaScript
52
star
22

asde

A low level module for destructuring asynchronous values.
JavaScript
50
star
23

pipe

Unix style pipes for nodejs streams `streamA | streamB | streamA`
JavaScript
46
star
24

pxx

a cli tool to store encrypted values in a json file and easily get them out again
JavaScript
40
star
25

net-log

a very fast network-based application logger
JavaScript
39
star
26

bale

A transpiler/module system polyfill for C++
C++
38
star
27

level-users

Store and get users, salt their passwords, persist them to disk, etc.
JavaScript
38
star
28

node-chat

This is very simple code that can be used to demonstrate the caveats and design issues associated with building real-time chat server that uses socket.io.
JavaScript
35
star
29

vines

[not actively maintained] Vines implements the gossip protocol as well as quorum-based voting machinery to facilitate cooperative decision making in distributed systems.
JavaScript
34
star
30

cxx-eventemitter

A minimalist event emitter for C++
C++
33
star
31

debug

A small debugging library for C++
C++
31
star
32

levelweb

LevelDB over http or https.
JavaScript
29
star
33

d

An git based, infrastructure-agnostic deploy tool for node.js
JavaScript
29
star
34

peerdrop

a cross-platform "airdrop" made as a demo for offline camp
JavaScript
27
star
35

route

A simple http router in c++ that can be used with nodeuv-http
C++
27
star
36

level-2pc

A two-phase-commit protocol for leveldb.
JavaScript
26
star
37

cxx-tap

Test Anything Protocol (TAP) Producer for C++
C++
25
star
38

dotfiles

Personal configuration files for unix-like environments.
Vim Script
23
star
39

packvis

package visualizer for the commandline
JavaScript
23
star
40

yl

A tiny flow control module that destructures.
JavaScript
22
star
41

telenode

Multi-vendor cellular network services for node.js
JavaScript
21
star
42

through-cache

a through stream that caches
JavaScript
20
star
43

level-sql

sql for nosql [a work in progress, contributors welcome!]
JavaScript
19
star
44

literate-router

markdown powered routing
JavaScript
17
star
45

cxx-fs

Provides a nodejs-like experience for file I/O in C++ using c++1y and libuv.
C++
17
star
46

level-subtree

build and maintain a tree from the sublevels in a leveldb instance
JavaScript
17
star
47

peerchan

Fully decentralized p2p IRC for your terminal
JavaScript
15
star
48

twitter

A feedless twitter client; broadcast, reply, stay productive. Read a book in your spare time.
JavaScript
15
star
49

to-ml

[deprecated] A tiny module to generate markup
JavaScript
14
star
50

pngify

Text ⇢ PNG ⇢ Text ┈ Pure JS. No dependencies.
JavaScript
13
star
51

cpp-stacktrace

Quick and simple stacktraces for C++
C++
12
star
52

eventemitter

Rust event emitter
Rust
12
star
53

pkp

Public Key Pen! (code from my Nodeconf.eu talk)
JavaScript
12
star
54

redirector

A simple redirect server / URL shortener in C++ backed by nodeuv-http (libuv and http_parser) and leveldb.
C++
12
star
55

forest

Javascript Implementations of SplayTrees, Fusion Trees, BTrees, etc.
JavaScript
11
star
56

node-admin

DEPRECATED
JavaScript
11
star
57

skipfile

Append data, seek forward and seek backward inside a binary file.
JavaScript
10
star
58

TIL

Today I Learned
10
star
59

MacBox

A fork of MacVM that fixes a bunch of UI issues
Swift
10
star
60

json

Better JSON handling for C++
C
10
star
61

tabulate

fit tabular data to the width of your terminal
JavaScript
10
star
62

timeseries-from-gitlog

Represent the git log as time-series data in JSON
JavaScript
10
star
63

cpp-libasync

general purpose asynchronous control flow helpers on thread-safe data structures
C++
9
star
64

stream-response

Respond with `json`, `html`, `text`, or `redirect`. Extend headers easily.
JavaScript
9
star
65

hashd

Recursively hash files in a specified path, appreciate ignore files and patterns.
JavaScript
8
star
66

through2-join

Produce a stream of intersecting data of two or more delimited json streams
JavaScript
8
star
67

go-indexof

The IndexOf() method returns the first index at which a given element can be found in the slice, or -1 if it is not present.
Go
7
star
68

go-tabulate

Column-like layout (padded to fit) for arrays of strings.
Go
7
star
69

ntail

tolerant tailing for your new line delimited json output
JavaScript
7
star
70

node-nosuchmethod

Object.create with a handler for methods that do not exist.
JavaScript
7
star
71

level-key

The easiest way to work with sublevels through multilevel.
JavaScript
7
star
72

subclass

A safe way to extend native types in Node.js and in modern browsers
JavaScript
7
star
73

dtn-website

dtnconf
HTML
7
star
74

level-mget

get multiple values from leveldb
JavaScript
7
star
75

netpeek

this is stupid, dont use it, its just an experiment.
JavaScript
7
star
76

pks

Public Key Server; an invite-only-approach with built in master-master replication.
JavaScript
6
star
77

wc-through

unix wc core util as a through stream, counts into an object
JavaScript
6
star
78

cp-mux

copy files over a multiplexed stream
JavaScript
6
star
79

postmortem

A searchable, issue-only repo for post-mortems (Idea / Template).
6
star
80

admin-template

DEPRECATED
JavaScript
5
star
81

date-at

easily create relative dates. ie: date('+1day')
JavaScript
5
star
82

go-termsize

Get the current size (width and height) of the terminal (nothing more!)
Go
5
star
83

qs

A minimalist dom library
JavaScript
4
star
84

test-env

Conditional output based on an environment variable
JavaScript
3
star
85

platform-module

boilerplate for creating a cross-platform module
JavaScript
3
star
86

getprops

Object.getPropertyDescriptor and Object.getPropertyNames
JavaScript
3
star
87

uvxx

A fork of node.native
C
2
star
88

stream-body

parse a stream correctly (according to the content-type) using raw-body
JavaScript
2
star
89

leveldb

leveldb
C++
2
star
90

electron-issue-17316-poc

Demonstrates issue with missing APIs when contextIsolation is set to true
JavaScript
2
star
91

raylib

C
1
star
92

esauto

Automatic type deduction for javascript
JavaScript
1
star
93

seq-lex

Creates or increments the value of a lexicographically sortable string. useful for creating sequential keys in leveldb
JavaScript
1
star
94

streamordie

A Javascript based band (recorded in front of a async audience)
1
star