orangesoft/throttler

Load balancer between nodes.

Maintainers

👁 orangesoft

Package info

github.com/denisyukphp/throttler

pkg:composer/orangesoft/throttler

Statistics

Installs: 33 008

Dependents: 1

Suggesters: 0

Stars: 17

Open Issues: 0

3.0.1 2024-11-19 16:18 UTC

Requires

  • php: ^8.1

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT dec835d84a26a1d9e8833e82c510d4761087a948

randomsmoothloadfrequencybalancingweightedroundrobin

This package is auto-updated.

Last update: 2026-06-19 19:41:52 UTC


README

👁 Build Status
👁 Latest Stable Version
👁 Packagist PHP Version Support
👁 Total Downloads
👁 License

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:

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

Read more about load balancing on Sam Rose's blog.