Distributed node.js event emitter based on redis pub/sub.
Supports channels (sort of namespaces). This code is heavily used 24x7 on a thousand-servers cluster.
While this iteration of redis-event was built for Humpback it is a good candiate for any server clusters who need to speak to eachother.
var RedisEvent = require('redis-event');
var options = {
prefix: 'sync',
redis: {
port: 1234,
host: '10.0.50.20',
auth: 'password',
db: 3, // if provided select a non-default redis db
options: {
// see https://github.com/mranney/node_redis#rediscreateclient
enable_offline_queue: false,
retry_max_delay: 10000,
max_attempts: 10000,
no_ready_check: true
}
}
}
//Connect to localhost redis
var ev = new RedisEvent(['updates', 'stats']);
ev.on('ready', function() {
ev.on('updates:server', function(data) {
console.log("Host %s updated to %d", data.hostname, data.count);
});
ev.pub('updates:test', {
launchedAt: new Date()
});
ev.pub('stats:date', {
now: new Date()
});
ev.on('updates:shutdown', function(data) {
ev.quit();
});
});
You can pass a redis connection to humpback-redis-event, or by default it will try to connect to a redis connection on localhost port 6379.
prefix
controls the key names used in Redis. By default, there is no prefix. Prefix generally shouldn't be changed unless you need to use one Redis instance for multiple apps. It can also be useful for providing an isolated testbed across your main application.
var options = {
prefix: 'sync',
redis: {
port: 1234,
host: '10.0.50.20',
auth: 'password',
db: 3, // if provided select a non-default redis db
options: {
// see https://github.com/mranney/node_redis#rediscreateclient
enable_offline_queue: false,
retry_max_delay: 10000,
max_attempts: 10000,
no_ready_check: true
}
}
}
var ev = new RedisEvent( ['updates', 'stats'], options );
You can also specify the connection information as a URL string.
var ev = new RedisEvent({
redis: 'redis://example.com:1234?redis_option=value&redis_option=value'
});
Below is a sample code to enable redis-sentinel to connect to Redis Sentinel for automatic master/slave failover.
var Sentinel = require('redis-sentinel');
var endpoints = [
{host: '192.168.1.10', port: 6379},
{host: '192.168.1.11', port: 6379}
];
var opts = options || {}; // Standard node_redis client options
var masterName = 'mymaster';
var sentinel = Sentinel.Sentinel(endpoints);
var ev = new RedisEvent(['updates', 'stats'],{
redis: {
createClientFactory: function(){
return sentinel.createClient(masterName, opts);
}
}
});
npm install humpback-redis-event
Initialise object.
Arguments
channel
- name(s) of the redis pub/sub channel(s) to subscribe tooptions
- optional object that may have following properties:redis
- redis connection to connect to.connectionFactory
= redis connection factory
Subscribe to Channel.
Arguments
channelName
- channel name;
Unsubscribe to Channel.
Arguments
channelName
- channel name;
Emit network event.
Arguments
eventName
- event name in form ofchannel:name
, eg.server:stats
payload
- optional JS object to add to the event. Must be serializable to JSON
Subscribe to network event. Special case: ready
event (see below).
Arguments
eventName
- event name in form ofchannel:name
, eg.server:stats
payload
- optional JS object that was added to event
This event is emitted when humpback-redis-event has successfully connected to both redis sub and pub channels. You will want to emit events only after this event is fired. If also can be fired multiple times in case there was a reconnect.
Disconnect from redis. This is actually useful to quit node application.