orangesoft / throttler
Load balancer between nodes.
Installs: 7 010
Dependents: 1
Suggesters: 0
Security: 0
Stars: 17
Watchers: 3
Forks: 0
Open Issues: 0
Requires
- php: ^8.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.10
- php-parallel-lint/php-console-highlighter: ^1.0
- php-parallel-lint/php-parallel-lint: ^1.3
- phpbench/phpbench: ^1.2
- phpunit/phpunit: ^9.5
- psalm/plugin-phpunit: ^0.17.0
- vimeo/psalm: ^4.26
README
Load balancer between nodes.
Installation
You can install the latest version via Composer:
composer require orangesoft/throttler
This package requires PHP 8.1 or later.
Quick usage
Configure Orangesoft\Throttler\WeightedRoundRobinThrottler::class
as below and set weight for each node if you are using weighted strategy:
<?php use Orangesoft\Throttler\Counter\InMemoryCounter; use Orangesoft\Throttler\Collection\NodeInterface; use Orangesoft\Throttler\Collection\Node; use Orangesoft\Throttler\WeightedRoundRobinThrottler; $throttler = new WeightedRoundRobinThrottler( new InMemoryCounter(), ); $collection = new InMemoryCollection([ new Node('192.168.0.1', 5), new Node('192.168.0.2', 1), new Node('192.168.0.3', 1), ]); while (true) { /** @var NodeInterface $node */ $node = $throttler->pick($collection); // ... }
As a result, the throttler will go through all the nodes and return the appropriate one according to the chosen strategy as shown below:
+---------+-------------+
| request | node |
+---------+-------------+
| 1 | 192.168.0.1 |
| 2 | 192.168.0.1 |
| 3 | 192.168.0.1 |
| 4 | 192.168.0.1 |
| 5 | 192.168.0.1 |
| 6 | 192.168.0.2 |
| 7 | 192.168.0.3 |
| n | etc. |
+---------+-------------+
The following throttlers are available:
- Orangesoft\Throttler\RandomThrottler
- Orangesoft\Throttler\WeightedRandomThrottler
- Orangesoft\Throttler\FrequencyRandomThrottler
- Orangesoft\Throttler\RoundRobinThrottler
- Orangesoft\Throttler\WeightedRoundRobinThrottler
- Orangesoft\Throttler\SmoothWeightedRoundRobinThrottler
Benchmarks
Run composer phpbench
to check out benchmarks:
+-------------------------------+------+-----+----------+----------+----------+---------+
| benchmark | revs | its | mean | best | worst | stdev |
+-------------------------------+------+-----+----------+----------+----------+---------+
| RandomBench | 1000 | 5 | 4.002μs | 3.880μs | 4.097μs | 0.073μs |
| WeightedRandomBench | 1000 | 5 | 11.660μs | 11.533μs | 11.797μs | 0.094μs |
| FrequencyRandomBench | 1000 | 5 | 6.074μs | 5.924μs | 6.242μs | 0.139μs |
| RoundRobinBench | 1000 | 5 | 4.060μs | 3.888μs | 4.363μs | 0.171μs |
| WeightedRoundRobinBench | 1000 | 5 | 10.778μs | 10.655μs | 10.919μs | 0.115μs |
| SmoothWeightedRoundRobinBench | 1000 | 5 | 6.888μs | 6.707μs | 7.102μs | 0.130μs |
+-------------------------------+------+-----+----------+----------+----------+---------+
The report is based on measuring the speed. Check best
column to find out which strategy is the fastest.
Documentation
- Available strategies
- Keep states
- Custom counter
- Custom strategy
- Multiple throttler
- Balance cluster
- Guzzle middleware
Read more about load balancing on Sam Rose's blog.