Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить round-robin scheduling?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Round-Robin** - алгоритм, за яким задачі чи запити обслуговуються по черзі й циклічно, без пріоритету: кожен наступний запит іде наступному серверу, а після останнього черга повертається до першого. **Ключове:** простий і швидкий, але ігнорує реальне навантаження серверів - для нерівномірної потужності є Weighted Round-Robin чи Least Connections.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що таке Round-Robin Scheduling > **Round-Robin (кругове розподілення)** - це алгоритм, > за якого задачі, запити чи користувачі обслуговуються **по черзі**, > **рівномірно й циклічно**, без пріоритету. Простіше кажучи: > "кожному - по черзі". ## Приклад принципу роботи Уяви, у тебе є 3 сервери: ```javascript Server A Server B Server C ``` І приходить потік запитів: `R1, R2, R3, R4, R5, R6, ...` Тоді за **Round-Robin** розподіл буде таким: ```javascript 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): 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 #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**.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.