Simple weighted round robin implementation using Redis list and sorted set
npm install redis-weighted-poolbash
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 testUsage
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)
`javascript
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.
`javascript
const myPool = new pool.RedisWeightedPool(null, client);myPool.length("myChannel")
.then(result => {
console.log({result});
})
.catch(error => {
console.error({error});
});
`Typescript
$3
`typescript
import {RedisConfig, IWeightedPool, RedisWeightedPool} from 'redis-weighted-pool';let config: RedisConfig = new RedisConfig(
"localhost",
6379,
null,
null
);
let myPool : IWeightedPool = new RedisWeightedPool(config);
`$3
`typescript
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);
});
`$3
`typescript
myPool.getNextPeer("channelId")
.then(result => {
// expect one of peer Ids to be returned
expect(result).toBeDefined();
})
.catch(error => {
done.fail(error);
});
`$3
`typescript
myPool.removePeer("channelId", "peerId1")
.then(result => {
// expect peer count to be decreased
expect(result).toBeDefined();
})
.catch(error => {
done.fail(error);
});
`$3
`typescript
myPool.reset("channelId")
.then(result => {
done();
})
.catch(error => {
done.fail(error);
});
`$3
`typescript
myPool.isEmpty("channelId")
.then(result => {
expect(result).toBeFalsy();
done();
})
.catch(error => {
done.fail(error);
});
`$3
`typescript
myPool.length("channelId")
.then(result => {
expect(result).toEqual(3);
done();
})
.catch(error => {
done.fail(error);
});
``