Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mikesparr/redis-weighted-pool
Simple weighted round robin implementation using Redis sorted set and list
https://github.com/mikesparr/redis-weighted-pool
load-balancing-algorithm object-pool pool redis weighted-round-robin
Last synced: about 6 hours ago
JSON representation
Simple weighted round robin implementation using Redis sorted set and list
- Host: GitHub
- URL: https://github.com/mikesparr/redis-weighted-pool
- Owner: mikesparr
- License: mit
- Created: 2018-05-14T06:32:25.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2018-11-29T21:58:04.000Z (about 6 years ago)
- Last Synced: 2024-12-16T22:41:10.990Z (25 days ago)
- Topics: load-balancing-algorithm, object-pool, pool, redis, weighted-round-robin
- Language: TypeScript
- Size: 70.3 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
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
```bash
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)
```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
### Initialization
```typescript
import {RedisConfig, IWeightedPool, RedisWeightedPool} from 'redis-weighted-pool';let config: RedisConfig = new RedisConfig(
"localhost",
6379,
null,
null
);let myPool : IWeightedPool = new RedisWeightedPool(config);
```### Add peers
```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);
});
```### Get next peer (weighted round robin)
```typescript
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
```typescript
myPool.removePeer("channelId", "peerId1")
.then(result => {
// expect peer count to be decreased
expect(result).toBeDefined();
})
.catch(error => {
done.fail(error);
});
```### Reset pool for channel
```typescript
myPool.reset("channelId")
.then(result => {
done();
})
.catch(error => {
done.fail(error);
});
```### Check if empty
```typescript
myPool.isEmpty("channelId")
.then(result => {
expect(result).toBeFalsy();
done();
})
.catch(error => {
done.fail(error);
});
```### Get pool length
```typescript
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)