Що робить round-robin scheduling?
Що таке Round-Robin Scheduling
Round-Robin (кругове розподілення) - це алгоритм, за якого задачі, запити чи користувачі обслуговуються по черзі, рівномірно й циклічно, без пріоритету.
Простіше кажучи:
"кожному - по черзі".
Приклад принципу роботи
Уяви, у тебе є 3 сервери:
Server A
Server B
Server CІ приходить потік запитів:
R1, R2, R3, R4, R5, R6, ...
Тоді за Round-Robin розподіл буде таким:
R1 → Server A
R2 → Server B
R3 → Server C
R4 → Server A
R5 → Server B
R6 → Server C
і так даліПісля останнього сервера черга повертається до першого - по колу ("round").
1. Де використовується Round-Robin
| Область | Застосування |
|---|---|
| Load Balancing (балансування трафіку) | Розподіляє HTTP-запити між серверами |
| Операційні системи | Планувальник задач для процесів і потоків CPU |
| Node.js Cluster / PM2 | Розподіляє вхідні з'єднання між воркерами |
| Мережеві балансувальники | NGINX, HAProxy, AWS ELB та ін. |
| Бази даних і черги | Рівномірний розподіл навантаження між репліками |
2. Як працює Round-Robin у Node.js Cluster
Node.js використовує Round-Robin під час балансування між воркерами (cluster чи PM2):
- Головний процес (
master) слухає вхідні з'єднання (наприклад, HTTP-порт 3000). - Кожен новий запит передається наступному воркеру в черзі.
- Коли черга доходить до кінця, цикл починається заново.
Отже:
Усі воркери отримують приблизно однакову кількість запитів, що забезпечує рівномірне навантаження CPU.
Приклад:
import cluster from 'cluster';
import http from 'http';
import os from 'os';
if (cluster.isPrimary) {
const numCPUs = os.cpus().length;
console.log(`Master ${process.pid} запускає ${numCPUs} воркерів`);
for (let i = 0; i < numCPUs; i++) cluster.fork();
} else {
http.createServer((req, res) => {
res.end(`Відповідь від воркера ${process.pid}`);
}).listen(3000);
}Node.js сам розподіляє запити між воркерами по колу (round-robin). Наприклад:
1-й запит → PID 1001
2-й запит → PID 1002
3-й запит → PID 1003
4-й запит → PID 10013. Приклад роботи Round-Robin у Nginx
nginx.conf
upstream backend {
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3003;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}За замовчуванням Nginx використовує round-robin, тому запити розподілятимуться так само:
#1 → 3001
#2 → 3002
#3 → 3003
#4 → 3001
...4. Особливості й переваги
| Перевага | Опис |
|---|---|
| Простота | Реалізується за кілька рядків |
| Рівномірність | Кожен вузол отримує однакове навантаження |
| Передбачуваність | Немає випадковості чи пріоритету |
| Без стану | Не потрібно зберігати дані про клієнтів |
| Висока швидкість | Мінімальні обчислювальні накладні витрати |
5. Недоліки Round-Robin
| Недолік | Опис |
|---|---|
| Ігнорує продуктивність серверів | Якщо один сервер слабший - він однаково отримує ту саму частку запитів |
| Немає sticky sessions | Один користувач може потрапити на різні сервери за кожного запиту |
| Не враховує навантаження в реальному часі | Навіть якщо сервер перевантажений - він продовжить отримувати нові запити |
| Не підходить для довгоживучих з'єднань (WebSocket) | Може перевантажити окремі воркери |
6. Модифікації алгоритму
Щоб усунути ці недоліки, існують покращені версії Round-Robin:
| Алгоритм | Відмінність |
|---|---|
| Weighted Round-Robin | Сервери отримують "вагу" (потужніші - більше трафіку) |
| Dynamic Round-Robin | Враховує поточне навантаження сервера |
| Least Connections | Віддає нові запити серверам із найменшою активністю |
| IP Hash | Той самий клієнт завжди потрапляє на той самий сервер (sticky sessions) |
7. Аналогія з реальним життям
Уяви чергу клієнтів у банку, де працюють 3 касири:
- перший обслуговує клієнта 1,
- другий - клієнта 2,
- третій - клієнта 3,
- наступний клієнт знову йде до першого касира.
Це і є Round-Robin - кожен касир (сервер) отримує клієнта по черзі.
Підсумок
| Критерій | Опис |
|---|---|
| Що робить | Розподіляє задачі чи запити по черзі й циклічно |
| Де застосовується | Балансування навантаження, планувальники, операційні системи |
| Тип | Простий, детермінований алгоритм |
| Переваги | Простий, рівномірний, ефективний |
| Недоліки | Не враховує продуктивність і навантаження серверів |
| Використовується в | Node.js Cluster, PM2, Nginx, HAProxy, AWS ELB |
Висновок:
Round-Robin Scheduling - це алгоритм "по черзі", який рівномірно розподіляє навантаження між усіма доступними вузлами (процесами, потоками чи серверами).
Він простий, швидкий і ефективний, тому використовується за замовчуванням у балансувальниках на кшталт Nginx, HAProxy, PM2 й Node.js Cluster.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.