Що таке Exponential Backoff і Random Jitter?

Обкладинка допису: Що таке Exponential Backoff і Random Jitter?
ЗмістНатисність на посилання, щоб перейти до потрібного місця
У розробці розподілених систем помилки - це не виняток, а норма. Мережа може підвиснути, сервіс - тимчасово впасти, база - відмовити на секунду. І в цей момент постає просте, але небезпечне питання: як саме повторювати запит? Якщо робити це так само, система легко сама себе доб’є.
Angry Spongebob Squarepants GIF.gif
Саме тут з’являються експоненційна затримка (exponential backoff) і випадковий джитер (random jitter).

Exponential Backoff

Exponential Backoff - це стратегія повторних спроб, коли кожен наступний retry (повторна спроба) відбувається з дедалі більшою затримкою. Ідея дуже проста: якщо щось зламалось, не варто одразу ж знову стукати в ті самі двері. Перший повтор може бути майже миттєвим, другий - через секунду, третій - через дві, потім чотири, вісім і так далі. Затримка росте експоненційно.
Це дає системі час "перевести подих". Якщо сервіс тимчасово перевантажений або падає через пікове навантаження, exponential backoff зменшує тиск, а не посилює його. Без цієї стратегії клієнти починають масово робити retry одночасно, і навіть здоровий сервіс може не витримати такого шквалу.
Але тут є підступний момент. Уявіть собі тисячу клієнтів, які одночасно отримали помилку і використовують однакову формулу backoff. Вони всі чекатимуть одну секунду, потім дві, потім чотири - і знову разом вдарять по серверу. Виходить синхронізований натовп, який приходить хвилями. Це вже знайома проблема - ефект "thundering herd".
Саме тому до exponential backoff майже завжди додають випадковий джитер (random jitter). Джитер - це невеликий випадковий зсув у затримці. Замість того щоб чекати рівно 4 секунди, клієнт може почекати 3.2, інший - 4.7, ще хтось - 2.9. Усі ті ж експоненційні затримки зберігаються, але запити більше не приходять одночасно.
З джитером система починає поводитися "живіше" і стабільніше. Навантаження розмазується в часі, сервісу легше відновитися, а ймовірність повторного падіння через масові retry різко зменшується. Це особливо важливо для API, черг, job-воркерів і будь-яких інтеграцій із зовнішніми сервісами.
Tor Muppets GIF.gif
У підсумку exponential backoff відповідає на питання "коли повторювати?", а джитер - "як зробити це не синхронно з усіма іншими?" Разом вони формують базову архітектуру для надійних систем. Якщо у вас є retry без backoff - це червоний прапорець. Якщо є backoff без джитера - жовтий. А коли є обидва, система має значно більше шансів пережити реальні, а не лабораторні збої.

Цей допис поки що не має жодних доповнень від автора/ки.

Що таке Elasticsearch і як він працює?
22 лист., 12:35

Що таке Elasticsearch і як він працює?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке time-series база даних?
22 лист., 12:42

Що таке time-series база даних?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
22 лист., 12:49

Що таке VACUUM у PostgreSQL?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке B-Tree (Balanced Tree)?
22 лист., 12:58

Що таке B-Tree (Balanced Tree)?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Фікс проблеми встановлення Ruby 3.4.3 (і не тільки) через RVM на macOS (Apple Silicon)
30 груд., 14:05

Фікс проблеми встановлення Ruby 3.4.3 (і не тільки) через RVM на macOS (Apple Silicon)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Thundering Herd Problem: що це таке і чому він ламає продакшен
15 січ., 10:14

Thundering Herd Problem: що це таке і чому він ламає продакшен

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Підключення сервісу Elasticsearch до Rails-додатку (Coolify у хмарі, сервер на Hetzner).
15 лют., 13:45

Підключення сервісу Elasticsearch до Rails-додатку (Coolify у хмарі, сервер на Hetzner).

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
 "No space left on device" - коли Docker з'їв весь диск
15 лют., 19:57

"No space left on device" - коли Docker з'їв весь диск

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
15 лют., 20:03

Sidekiq 7.3.x та connection_pool 3.0 - несумісність, яка ламає воркери

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska