pushpull
v2.1.8
Published
Push/Pull pattern using Redis lists as backend
Downloads
2
Maintainers
Readme
Push/Pull
Implement a Push/Pull mecanism using Redis as backend. This pattern is typically used to handle pool of workers.
Installation
npm install --save pushpull
If you don't already use Redis and still use npm ≤ 2.x, you'll have to install redis
too:
npm install --save redis
You may want to install hiredis
to, whenever possible:
npm install --save-optional hiredis
Usage
Look at (and run) sample.js
for a working example.
// Worker
var Pull = require("./").Pull;
var worker = new Pull(options);
worker.on("data", function (data) {
// do something with data
});
// Sender
var Push = require("./").Push;
var sender = new Push(options);
sender.emit("data", {"some": "data"});
Pull API
Pull
instances are valid readable streams (object mode).
new Pull(options)
: constructor, see Options belowdata
event: emitted when data has been pulled from queueerror
event: emitter when an error occurs (seriously)pause()
: stop querying for more data- IMPORTANT: this method cannot interrupt current fetch, which means one job can be pulled before puller is actually paused. This data will be buffered and emitted again as soon as you call
resume()
.
- IMPORTANT: this method cannot interrupt current fetch, which means one job can be pulled before puller is actually paused. This data will be buffered and emitted again as soon as you call
resume()
: quit pauseend()
: close the underlying Redis client, which obviously prevents any further query
Push API
Push
instances are valid writable streams (object mode).
new Push(options)
: constructor, see Options belowwrite(data)
: emit this event to push a job to queuepushed
event: emitted when data has been pushed successfullyerror
event: emitter when an error occurs (seriously)end()
: close the underlying Redis client, which obviously prevents any further query
Options
queue
(mandatory): queue name, to be shared between worker(s) and sender(s)- Note: a Redis list with this name will be created. No decoration added, if you want to ensure unicity of the name, it's up to you to add prefix or suffix
timeout
(Pull only, default = 30 seconds): timeout between twoBLPOP
commands, the lower the value, the higher the chance not to grab data when callingpause()
client
: the Redis client to be used- IMPORTANT: a
Pull
instance will runBLPOP
commands, which BLOCK the client. It's highly advised to use a unique client for each puller.
- IMPORTANT: a
host
(default = localhost): Redis host (ifclient
is not set)port
(default = 6379): Redis port (ifclient
is not set)database
: Redis database to select once connected, if set
Internals
In both Push
and Pull
instances, you have access to some semi-privates:
_redisClient
is the internal Redis client instance_queue
is the name of the queue- Note: changing its value will have expected effect, although you should only do it if you know what you're doing
Why documenting those internals? Because I use them in a project using this module, and I want to make sure those features don't get away with no warning.