Kubek z Dławią: Metaphora, która Przejdzie Test
Algorytm kubka z dławicą otrzymuje swoją nazwę ze skojarzenia bardzo prostej i dosłownej metaphore. Wyobraź sobie fizyczny kubek z małą, ustaloną wielkością dławicy w jego dole. Woda, reprezentująca przychodzące pakiety danych, żądania API lub dowolne jednostki ruchu sieciowego, może być wylewana na górę kubka z jakiegokolwiek prędkości: spływ małych kropli, regularny strumień lub nagle intensywna burza. Nie ma znaczenia, jak nieprzewidywalne jest przychodzące dane. Ważne jest dławica, która wypuszcza wodę z kubka z jednolitym i niezmienionym tempem, niezależnie od tego, ile wody znajduje się obecnie w kubku. Jeśli przychodząca woda płynie szybciej niż dławica może ją wypuszczać, poziom wody wzrasta. Gdy kubek w końcu zostanie zapełniony do brzegu, dodatkowa woda, która jest wylewana, proste przewalając się nad krawędź i stracona, reprezentuje pakiety, które są odrzucone lub żądania, które są odmówione, ponieważ system nie ma już miejsca na absorbację burzy. To piękno tej metaphore: jedna ustalona wartość, wielkość dławicy, jest całą rzeczą, która rządzi prędkością wyjścia, a pojemność kubka jest całą rzeczą, która rządzi tym ile burzy można tymczasowo zasugerować przed czymkolwiek musiałoby ustąpić. Tempo wypuszczenia dławicy jest całym celem tego algorytmu.
Zamiana Chaosu na Prostą Linię
Prawdziwe wykorzystanie algorytmu surowienia burzliwego (leaky bucket) pojawia się, gdy patrzymy, co zdarza się ruchom sieciowym podczas przetwarzania przez ten algorytm. Ruch wejściowy w rzeczywistych sieciach niemal nigdy nie jest gładki. Użytkownicy klikają w grupkach, ramki filmu przychodzą w naciskach, czujniki zwracają odczyty w grupach po długim okresie bezczynności. Jeśli ten szpiczasta i nieprzewidywalny wzór przybywa bezpośrednio do systemu dolistującego, łatwo mógłby przewyższyć serwer, router lub przełącznik zaprojektowany tylko do obsługi stałej maksymalnej przepustowości. Surowiec burzliwego prądu (leaky bucket) znajduje się między źródłem nacisku a niewykonalnym konsumentem dolistującym, aksorząc nieprzewidywalność. Niezależnie od tego, jak chaotyczny wykres wejściowy wygląda, szpiczasta, milcząca, ponownie szpiczasta, wykres wyjściowy opuszczający surowiec jest płaski: stała kroplica zgodnie z ustawioną szybkością utraty. To dokładnie dlaczego inżynierowie komunikacyjni i architekti sieci szukają tego algorytmu. Konwertuje on nieprzewidywalny proces przybywania na deterministyczny, stały-proces wyjścia, co ułatwia znacząco planowanie pojemności dla kolejnego skoku. Będąca w dolnej części bazy danych, system rachunkowy lub mikrousługa tła już nie musi być zaprojektowana do obsługi najgorszych nacisków; wystarczy, że obsługuje szybkość utraty, ponieważ surowiec burzliwego prądu już zrobił pracę uśmierzającą w górnej części.
Dwie Wersje: Kiełbasz jako kolejka versus kiełbasz jako miernik
W praktyce algorytm kiełbasy zatopionej jest zaimplementowany w dwóch odmiennych formach, a różnica ma znaczenie dla przeznaczenia nadmiaru ruchu. Pierwsza wersja to kiełbasz jako kolejka, często nazywany również kiełbaską jako harmonogram. W tej wersji kiełbasa jest rzeczywiście ograniczoną pamięcią: pakiety przychodzące szybciej niż ściekająca prędkość czekają na miejsce wewnątrz kiełbaszy, aż dojdzie do ich wydania z stałym wyjściowym tempem. Nic nie jest rzucać, chyba że sama kolejka jest pełna, co oznacza, że nowe przybycia przekroczyć granicę i zostaną zrzucone. Ta wersja aktywnie formuje ruch w czasie, opóźniając pakiety, aby zagładzić wyjście. Druga wersja to kiełbasz jako miernik, często nazywany również kiełbaską jako licznikiem. Zamiast przechowywać pakiety i relatywne później, ta wersja śledzi poziom wody wirtualną, aby ocenić, czy ruch przestrzega ustalonego tempa. Przestrzegający ruch jest natychmiast przepuszczany; nieprzestrzegający ruch, tzn. ruch, który przekroczyłby granicę wirtualnej kiełbaszy, może być zrzucany całym czy oznaczany jako niskopriorytetowy lub poza profilu do potencjalnego zrzucenia dalej. Wersja z kolejką formuje ruch poprzez dodanie opóźnienia; wersja jako miernik polityzuje ruch, podjęwiając decyzję o przyjęciu lub zrzuceniu. Oba użycia mają podobne matematyki wypełniania i ściekania na dole.
Leaky Bucket vs. Token Bucket: Miękkość Przepływu versus Wytrzymałość Wobec Burzliwych Zapytań
Algorytm leaky bucket jest często porównywany, a czasami pomyłkowo zastępowany przez swoim bliskim krewny – algorytmem token bucket. Jednak oba algorytmy reprezentują naprawdę różne filozofie. Stronna implementacja algorytmu leaky bucket ustawia absolutnie stałą stawkę wyjściową: nie ma mechanizmu pozwalającego na szybsze przepuszczenie ruchu niż ustalony spadek poziomu, nawet jeśli butelka była pusta przez długi czas. Każdy paczkat, tak jakby, nadal musi stać w kolejce i odpływać z tą samą regularną prędkością. Algorytm token bucket odwrotnie obraca tę myśl. Zamiast spadkowania, tworzy on tokeny uprawnień na stałe, gdy system jest wolny, aż do pewnej maksymalnej wielkości butelki, i pakiet może być przesłany tylko wtedy, gdy będzie mógł zatopić token. Oto kluczowe: jeśli butelka była wypełniana nieużywanymi tokenami podczas okresu cicha, przybyły ruch burzliwy może pożerać wszystkie te zapisane tokeny naraz i być przesłany prawie natychmiastowo, dopóki jest dostępna ilość tokenów. To sprawia, że algorytm token bucket wydaje się znacznie przyjacielski dla prawidłowych aplikacji burzliwych, takich jak klient, który zwykle jest cichy, ale czasami musi wysłać szybką serię żądań, ponieważ nagradza on poprzednie okresy wolności pozwoleniem na burzę. Algorytm leaky bucket prioritizuje doskonałą, przewidywalną regularność wyjściową powyżej wszystkiego; token bucket prioritizuje elastyczność i przyjazność dla burzliwych aplikacji, mimo że nadal ustawia granicę średniej stawki w długim okresie. Wybór między nimi to naprawdę wybór między miękkością a wytrzymałością wobec burzy.
Od.exchangeów telefonicznych do współczesnych API
Algorytm wazona butelki nie pochodzi z zakresu oprogramowania; jego formalizacja miała miejsce w kontekście sieciowych systemów przesyłania Asynchronous Transfer Mode, ATM, w latach 80. i 90., gdzie operatorzy telekomunikacyjni potrzebowali precyzyjnego, przyjaznego dla sprzętu sposobu kształtowania ruchu komórkowego i gwarantowania, że połączenie subskrybenta nie przekroczy umieszczonego w negocjacji limitu prędkości przesyłania danych. Ta tradycja zasad stringowych, przewidzianych działania jest nadal widoczna w tym, jak algorytm jest używany dzisiaj. W współczesnych systemach oprogramowania, pojawia się on regularnie jako silnik za taktowaniem szybkości wywołań API, gdzie usługa chce gwarantować klientom regularną i sprawiedliwą szybkość zapytań oraz łagodzi zachowanie awansowanej jednostki, zamiast pozwolić agresywnemu klientowi na zaludnienie systemu. Nigdy nie przestaje być także standardem w zarządzaniu jakością usługi w sieci, QoS, w routery i przełącznikiach, gdzie polityki kształtowania ruchu wykorzystują kolejki podobne do wazona butelki, aby upewnić się, że jedna strumień lub klient nie może monopolizować współdzielonego łącza i zasychać ruchu innych klientów. Sieci dostarczania treści, balancerzy obciążenia i systemy ograniczające dostawców chmur korzystają z tej samej podstawowej logiki wypełnij-i-później-powodzę, często łącząc ją z pomysłami butelki tokenów dla elastyczności. Gdziekolwiek system potrzebuje konwersji nieprzewidzianego żądania na regularne i bezpieczne strumienie, który można bezpiecznie zaakceptować dalej, wazon butelki, w jednej z dwóch form, tendencja jest do cichego wykonania pracy w tle.
Często zadawane pytania
Czym jest algorytm kubka z pływającą brzegą?
Służy on do ruchu ruchu sieciowego i ograniczania szybkości: konwertuje impulsowy, nieciągi ruchu przychodzącego, takiego jak pakiety sieciowe lub żądania API, na ciągły wyjście o stałej szybkości, chroniąc system receptorzowy z ograniczoną lub ustaloną pojemnością przetwarzania.
Co się stanie, gdy kubek będzie pełny?
Gdy kubek osiągnie swoją maksymalną pojemność, dalszy ruch przychodzący przefluje. W zależności od implementacji, taki przefluwany ruch jest albo całkowicie zrzucany, jak w wersji metra, albo prosto odrzuca się go z kolejki, nie podążając do niej, co prowadzi do odrzucenia.
Jakie są różnice między kubkiem z pływającą brzegą jako kolejką a jako metrem?
Wersja z kolejką, czyli szacownika, rzeczywiście przechowuje nadmiarowe pakietów w buforze i pozwala na ich wydanie później o stałym stopniu pływającym, dodając opóźnienie ale zachowując je. Wersja metra, czyli z licznikami, nie przeszkadza w niczym; prosto pomiar konformacji i natychmiastowe zrzucanie lub oznakowanie ruchu przekraczającego dozwoloną szybkość.
Jak się różni kubek z pływającą brzegą od butelki z tokenami?
Kubek z pływającą brzegą wymusza na wyjściu ciągłą szybkość o stałym stopniu bez wyjątków, nawet po okresach spoczynku. Butelka z tokenami akumuluje tokeny podczas okresów spoczynku i pozwalają na przepustkę impulsu ruchu natychmiastowej, aż do liczby zapisanych tokenów, co sprawia, że jest bardziej wytrzymała przed prawidłowymi impulsami, podczas gdy kubek z pływającą brzegą uprzywilejowuje idealnie ciągły wyjście.
Gdzie pochodzi algorytm kubka z pływającą brzegą?
Pochodzi on z sieci komunikacyjnych Asynchronicznej Transfer Mode, ATM, gdzie operatorzy potrzebowali wiarygodnego sposobu na kształtowanie ruchu i przysparzanie umów na szerokość pasma. Od tamtej pory został szeroko przyjęty w ograniczaniu szybkości API, ustawieniu jakości usługi routerów i wymienników oraz ogólnym zarządzaniu zagęszczeniem sieci.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz The Leaky Bucket Algorithm: Smoothing Bursty Network Traffic i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację The Leaky Bucket Algorithm: Smoothing Bursty Network Traffic