StanchionJS
A simple & fast queue done right. backed by Redis, supports auto-reconnect, TypeScript, Promise and Rxjs.
Features
-
Fast. Just BLPOP
and RPUSH
, no other fancy stuff, simple and fast.
-
Auto-Reconnect.
-
Works with Promise. Unleash the power of async / await
, say bye-bye to callback.
-
Better error handling.
-
Written in TypeScript. No hacky code and provides better experience if you are using TypeScript
.
-
Reactive. If you don't like making promises, there're reactive APIs too, all APIs have two versions.
Installation
$ npm i stanchionjs
Examples
Initialize
const { Stanchion } = require('stanchionjs');
const stanchion = new Stanchion({
redis: {
host: '127.0.0.1',
port: 6379,
db: '1',
},
concurrency: 20,
});
How To Create a Job
const { Stanchion } = require('stanchionjs');
const stanchion = new Stanchion();
const job_1 = {
thing: 'apple',
};
const job_2 = {
thing: 'banana',
};
stanchion.push(job_1, job_2).then(() => {
console.log('jobs created.');
});
stanchion.push$(job_1, job_2).subscribe(() => {
console.log('jobs created.');
});
How To Process a Job
When a Job processing is done, you must tell StanchionJS
so it can go fetching next Job for you. StanchionJS
provides several ways to do that:
const { Stanchion } = require('stanchionjs');
const { Observable } = require('rxjs');
const stanchion = new Stanchion();
stanchion.process(job => new Promise((resolve, reject) => {
console.log('Got a job:', job);
resolve();
}));
stanchion.process(async job => {
console.log('Got a job:', job);
});
stanchion.process$(
job => Observable.of(job)
.map(job => {
console.log('Got a job:', job);
})
).subscribe();
Error Handling
Every exception (including those from redis
) can be obtained by attach handler to Stanchion
instance:
const { Stanchion } = require('stanchionjs');
const stanchion = new Stanchion();
stanchion.onError(err => {
console.log('error occurred', err);
});
stanchion.onError$().subscribe(err => {
console.log('error occurred', err);
});
How To Exit
const { Stanchion } = require('stanchionjs');
const stanchion = new Stanchion();
stanchion.shutdown().then(() => {
console.log('Stanchion exited.');
});
stanchion.shutdown$().subscribe(() => {
console.log('Stanchion exited.');
});
When Exited
const { Stanchion } = require('stanchionjs');
const stanchion = new Stanchion();
stanchion.onShutdowned(() => {
console.log('Stanchion exited.');
});
stanchion.onShutdowned$().subscribe(() => {
console.log('Stanchion exited.');
});
Reference
Interfaces
ConstructOptions
Default value:
{
redis: {
host: '127.0.0.1',
port: 6739,
},
concurrency: 10,
redisKey: 'stanchion_queue',
retryAttempts: 6,
}
Stanchion
Stanchion#constructor
constructor(options: ConstructOptions)
Stanchion#push
push(...jobs: any[]): Promise<void>
Stanchion#push$
push$(...jobs: any[]): Observable<void>
Stanchion#getSize
getSize(): Promise<number>
Stanchion#getSize$
getSize$(): Observable<number>
Stanchion#onError
onError(handler: ErrorHandler): Subscription
Stanchion#onError$
onError$(): Subject<any>
Stanchion#process
process(processor: PromiseProcessor): Promise<void>
Stanchion#process$
process$(processor: ObservableProcessor): Observable<void>
Stanchion#shutdown
shutdown(): Promise<void>
Stanchion#shutdown$
shutdown$(): Observable<void>
Stanchion#isShutdowned
isShutdowned(): boolean
Stanchion#onShutdowned
onShutdowned(cb: VoidFunction): Subscription
Stanchion#onShutdowned$
onShutdowned$(): Observable<void>
TODOs
-
Tests. Although Stanchion is bettle-tested, handling about 26K jobs per second.
-
Multiple queue (Redis key) support.
-
"unprocess" method.
-
Key-sharding support for cluster usage.
Credits
Awesome icon by Freepik, licensed under the Creative Commons BY 3.0.
Inspired by Neamar/featureless-job-queue.