Skip to main content

Що робить round-robin scheduling?

Що таке Round-Robin Scheduling

Round-Robin (кругове розподілення) - це алгоритм, за якого задачі, запити чи користувачі обслуговуються по черзі, рівномірно й циклічно, без пріоритету.

Простіше кажучи:

"кожному - по черзі".

Приклад принципу роботи

Уяви, у тебе є 3 сервери:

javascript
Server A Server B Server C

І приходить потік запитів: R1, R2, R3, R4, R5, R6, ...

Тоді за Round-Robin розподіл буде таким:

javascript
R1Server A R2Server B R3Server C R4Server A R5Server B R6Server 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):

  1. Головний процес (master) слухає вхідні з'єднання (наприклад, HTTP-порт 3000).
  2. Кожен новий запит передається наступному воркеру в черзі.
  3. Коли черга доходить до кінця, цикл починається заново.

Отже:

Усі воркери отримують приблизно однакову кількість запитів, що забезпечує рівномірне навантаження CPU.

Приклад:

javascript
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). Наприклад:

javascript
1-й запит → PID 1001 2-й запит → PID 1002 3-й запит → PID 1003 4-й запит → PID 1001

3. Приклад роботи Round-Robin у Nginx

nginx.conf

javascript
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, тому запити розподілятимуться так само:

javascript
#13001 #23002 #33003 #43001 ...

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.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.