redis-weighted-pool
v0.2.1
Published
Simple weighted round robin implementation using Redis list and sorted set
Downloads
443
Maintainers
Readme
Redis Weighted Pool
This is a simple Promise based multi-channel weighted round robin pool implementation that leverages Redis sorted set and list.
Requirements
You will need Redis server running.
Installation
npm install redis-weighted-pool
yarn add redis-weighted-pool
Test
The test script in package.json
preprocesses the .ts
file and then executes.
npm test
Usage
The source was written in Typescript, yet it compiles to Javascript (npm run build
). You can use in ES5 or later supported environments. The following code snippets are implemented in the __tests__
folder.
Quick start (Node)
const pool = require('redis-weighted-pool');
const config = pool.RedisConfig("localhost", 6379, null, null);
const myPool = new pool.RedisWeightedPool(config);
myPool.length("myChannel")
.then(result => {
console.log({result});
})
.catch(error => {
console.error({error});
});
Optional with existing client
If you already have a program with a RedisClient
you can pass the client as an optional second parameter.
const myPool = new pool.RedisWeightedPool(null, client);
myPool.length("myChannel")
.then(result => {
console.log({result});
})
.catch(error => {
console.error({error});
});
Typescript
Initialization
import {RedisConfig, IWeightedPool, RedisWeightedPool} from 'redis-weighted-pool';
let config: RedisConfig = new RedisConfig(
"localhost",
6379,
null,
null
);
let myPool : IWeightedPool<string> = new RedisWeightedPool(config);
Add peers
Promise.all([
myPool.addPeer("channelId", "peerId1", weight1),
myPool.addPeer("channelId", "peerId2", weight2),
myPool.addPeer("channelId", "peerId3", weight3)
])
.then(values => {
done();
})
.catch(error => {
done.fail(error);
});
Get next peer (weighted round robin)
myPool.getNextPeer("channelId")
.then(result => {
// expect one of peer Ids to be returned
expect(result).toBeDefined();
})
.catch(error => {
done.fail(error);
});
Remove peer from channel
myPool.removePeer("channelId", "peerId1")
.then(result => {
// expect peer count to be decreased
expect(result).toBeDefined();
})
.catch(error => {
done.fail(error);
});
Reset pool for channel
myPool.reset("channelId")
.then(result => {
done();
})
.catch(error => {
done.fail(error);
});
Check if empty
myPool.isEmpty("channelId")
.then(result => {
expect(result).toBeFalsy();
done();
})
.catch(error => {
done.fail(error);
});
Get pool length
myPool.length("channelId")
.then(result => {
expect(result).toEqual(3);
done();
})
.catch(error => {
done.fail(error);
});
Contributing
I haven't thought that far ahead yet. I needed this for my project and wanted to give back. ;-)
License
MIT (if you enhance it, fork and PR so the community benefits)