Яма з Діркою: Аналогія, Що Працює
Алгоритм «протікаючої відерця» отримав свою назву завдяки дуже вдумливому та буквальному уявленню. Уявіть фізичне відерце з невеликою, постійною за розміром діркою, просвербленою на дні. Вода, яка представляє собою вхідні пакети даних, запити API або будь-яку одиницю мережевого трафіку, може бути залита у верхню частину відерця з будь-якою швидкістю: повільним струмом, сталим потоком або раптовим потужним попихом. Не має значення, наскільки непередбачуваною є вхідна інформація. Важлива дірка, яка дренує воду з відерця з постійним, незмінним темпом, незалежно від того, скільки води зараз всередині. Якщо вхідна вода приходить швидше, ніж дірка може її відлити, рівень води піднімається. Якщо відерце врешті-решт наповнюється до країв, будь-яка додаткова вода, залита у нього, просто переливається по краю та втрачається, що представляє пакети, які відкидаються, або запити, які відхиляються, оскільки система більше не може поглинути пік. Це краса моделі: єдивий фіксований параметр, розмір дірки, керує вихідним темпом, а ємність відерця визначає, скільки піків можна тимчасово поглинути, перш ніж щось дасть про себе знати.
Перетворення Хаосу в Пряму Лінію
Реальна цінність капельного відра проявляється, коли ми дивимося на те, що відбувається з трафіком під час його проходження через алгоритм. Вхідний трафік у реальних мережах майже ніколи не є плавним. Користувачі натискають групами, кадри відео надходять спалахами, датчики повідомляють про показники партіями після деякого часу бездіяльності. Якщо цей нерівномірний, непередбачуваний шаблон прибуття передавався безпосередньо до системи, яка знаходиться внизу, це могло б легко перевантажити сервер, маршрутизатор або комутатор, який призначений лише для обробки сталого максимального пропускного здіймлення. Капельне відра розташоване між нерегулярним джерелом і крихким споживачем знизу та поглинає нерегулярність. Незалежно від того, яким хаотичним виглядає вхідний графік, спалах, тиша, спалах знову, вихідний графік, який залишається у відрі, рівний: постійний крапельний потік за налаштованим коефіцієнтом протікання. Це тому, що інженери та архітектори телекомунікацій і мереж звертаються до нього. Воно перетворює непередбачуваний процес прибуття в детермінований постійний потік відправлення, який значно спрощує планування ємності наступного етапу. Нижче розташована база даних, система обробки платежів або мікросервіс не потрібно будувати для найгіршого випадку спалахів; їм потрібно лише обробляти коефіцієнт протікання, оскільки відра вже виконало роботу з вирівнювання вгорі.
Два смаги: Каністра як черга проти каністри як лічильник
На практиці алгоритм ‘протікаючої каністри’ реалізується двома окремими способами, і ця різниця суттєво впливає на те, що відбувається з надлишковим трафіком. Перша версія – каністра як черга, також відома як ‘планувальник каністри’. Тут каністра буквально є кінцевим буфером: пакети, які надходять швидше за швидкість протікання, просто чекають у черзі всередині каністри до моменту їхнього випуску з постійним потоком. Жоден пакет не викидається, якщо тільки сама черга не повна, тоді нові пакети переповнюють її та втрачаються. Ця версія активно змінює трафік у часі, затримуючи пакети для згладжування вихідного потоку. Друга версія – каністра як лічильник, також відома як ‘лічильник каністри’. Замість зберігання пакетів і їхнього подальшого випуску, цей варіант просто відстежує віртуальний рівень води для вимірювання того, чи відповідає трафік узгодженій швидкості. Відповідний трафік проходить миттєво; невідповідний трафік – тобто трафік, який би переповнив віртуальну каністру, або повністю відсікається, або позначається як низької пріоритетності чи поза профілем для потенційного відкидання далі вниз за потоком. Чергова версія формує трафік шляхом додавання затримок; лічильна версія контролює трафік шляхом прийняття рішення про пропуск або відсікання. Обидва поділяють одну й ту саму математику наповнення та витікання під ними.
Вижневий кошик проти токенного кошика: Плавність проти стійкості до стрибків
Вижневий кошик часто порівнюють, і іноді плутають, з його близьким родичем – алгоритмом токена кошика, але обидва втілюють справді різні філософії. Суворий вижневий кошик застосовує абсолютно постійний рівень виходу: немає жодного механізму, який би дозволив стрибку трафіку проходити швидше за фіксовану швидкість витоку, навіть якщо кошик довго залишався порожнім раніше. Кожна крапля, таким чином, все ще повинна чергуватися та стікати з однаковою постійною швидкістю. Алгоритм токена кошика перевертає цю ідею. Замість витоку він накопичує дозвольні токени на постійній швидкості, коли система неактивна, до певного максимального розміру кошика, і пакет може бути переданий лише тоді, коли він може витратити токен. Важливо, що якщо кошик заповнювався невикористаними токенами під час спокійної періодичності, прибулий стрибок трафіку може одночасно використати всі збережені токени та відправити його практично миттєво, до кількості доступних токенів. Це робить токенний кошик помітно більш дружнім до легітимних стрибкових додатків, таких як клієнт, який зазвичай тихий, але іноді потребує швидкої черги запитів, оскільки він винагороджує попередній період бездіяльності з дозволом на стрибок. Вижневий кошик пріоритезує ідеально плавну та передбачувану вихідну продуктивність понад усе; токенний кошик пріоритезує гнучкість та адаптацію до стрибків, одночасно обмежуючи середній рівень виходу в довгостроковій перспективі. Вибір між ними насправді є вибором між плавністю та стійкістю до стрибків.
Від телефонних станцій до сучасних API
Алгоритм «тікаючого відра» не виник у програмному забезпеченні; він був формалізований у контексті асинхронного передавання даних (ATM), телекомунікаційних мереж, в 1980-х та 1990-х роках, де оператори зв’язку потребували точного, зручного для апаратного забезпечення способу формування трафіку каналів та гарантування того, щоб з’єднання підписника не перевищувало умовний пропускну здатність, що було узгоджено. Це успадкування жорсткого, передбачуваного контролю все ще видно в тому, як використовується алгоритм сьогодні. У сучасних програмних системах це проявляється постійно як двигун за API-обмеженням швидкості, де служба прагне гарантувати клієнтам стабільний та справедливий рівень запитів і згладжувати спайкові поведінку клієнтів замість того, щоб дозволити одному агресивному клієнту переповнювати задній план. Також це залишається основою для забезпечення якості мережі (QoS) всередині маршрутизаторів та комутаторів, де політики формування трафіку використовують черги на основі «тікаючого відра», щоб забезпечити те, що один потік або клієнт не може монополізувати спільний зв’язок і позбавляти інших клієнтів пропускної здатності. Контентні мережі доставки, балансувачі навантаження та системи обмеження швидкості хмарних постачальників усякий раз запозичують ту саму фундаментальну логіку «наповнення та витікання», іноді змішану з ідеєю контейнера токенів для гнучкості. Де завгодно система потребує перетворення непередбачуваного попиту на стабільний, постійний потік, який може безпечно поглинути нижче розташоване ресурсо, алгоритм «тікаючого відра» в одній із своїх двох форм зазвичай тихо виконує цю роботу у фоновому режимі.
Frequently asked questions
Для чого використовується алгоритм «протікаючої відро», або leaky bucket?
Він використовується для формування трафіку та обмеження швидкості: перетворює нерегулярний, імпульсивний вхідний трафік, такий як мережеві пакети чи запити API, на плавний, постійний потік, що захищає систему з обмеженими або фіксованими обчислювальними потужностями.
Що відбувається, коли відро повне?
Коли відро досягає своєї максимальної ємності, будь-який подальший вхідний трафік переповнюється. Залежно від реалізації, цей надлишковий трафік або повністю відкидається, як у варіанті лічильника, або просто не може бути прийнятий до черги та відхиляється, як у варіанті черги.
Яка різниця між «протікаючою відро» як чергою та «протікаючою відро» як лічильником?
Варіант з чергою, або планувальником, насправді зберігає надлишки пакетів у буфері та випускає їх пізніше з постійним швидкістю витікання, додаючи затримку, але зберігаючи їх. Варіант лічильника, або мірача, не збільшує затримку; він просто вимірює відповідність і негайно відкидає будь-який трафік, що перевищує дозволену швидкість.
Як «протікаюча відро» відрізняється від «токеноїдної відро»?
«Протікаюча відро» змушує вихід залишатися строго постійним, без жодних винятків, навіть під час простою. «Токеноїдна відро» накопичує токени протягом періодів простою та дозволяє пропустити спалах трафіку на кількість збережених токенів, роблячи її більш стійкою до легітимних спаків, тоді як «протікаюча відро» надає перевагу ідеально плавному вихідному потоку.
Звідки походить алгоритм «протікаючої відро»?
Він походить з Asynchronous Transfer Mode (ATM), телекомунікаційних мереж, де оператори потребували надійного способу формування трафіку та забезпечення дотримання умов про пропускну здатність. Він широко впроваджено в обмеження швидкості API, забезпеченні якості обслуговування маршрутизаторів і комутаторів, а також загальному контролі над перевантаженням мережі.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте The Leaky Bucket Algorithm: Smoothing Bursty Network Traffic і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію The Leaky Bucket Algorithm: Smoothing Bursty Network Traffic