Ограничение скорости (3 часть серии)
В предыдущем посте мы прошли ограничение по ставкам и что это такое. Затем мы представили алгоритм под названием ведро токена и реализовали его в Python.
Я решил превратить это в серию и посвятить каждый пост алгоритму.
И в этом посте мы узнаем о фиксированном окне и его реализации в Python.
Фиксированное окно
Как следует из названия, это все о Windows. В этом алгоритме мы разделим время в фиксированные окна, а затем отобразите входящие события в эти окна.
Сам алгоритм довольно прост без аналогии, но давайте начнем с одного в любом случае.
Представьте себе движущийся поезд. Есть ворота и в любой момент, люди могут доскамиться только одного вагона (Да, люди насаждают движущийся поезд, ничего странного).
Предположим, что окно посадки для каждого вагона составляет 1 минуту. Так что, если вагон полностью, вам нужно ждать до минуты для следующего вагона.
В этой аналогии поезд – это время! Время всегда движется вперед и в каждом временном кадре, у нас есть фиксированное окно прохождения.
В этой очень простой реализации мы создадим ограничитель скорости, который использует фиксированное окно для ограничения пакетов в 1-секундные рамы времени.
Начнем с определения класса с 3 аргументами, когда оно призвано.
- Емкость: Количество разрешенных пакетов, которые могут пройти через секунду.
- Forward_Callback: Эта функция называется, когда пакет пересылается.
- Drop_Callback: Эта функция называется, когда пакет должен быть сброшен.
Мы префилируем недвижимость по имени пособие
Чтобы позволить пакету пройти через первую секунду.
Current_time
Является ли текущий временной кадр, который использует ограничитель скорости.
from time import time, sleep class FixedWindow: def __init__(self, capacity, forward_callback, drop_callback): self.current_time = int(time()) self.allowance = capacity self.capacity = capacity self.forward_callback = forward_callback self.drop_callback = drop_callback
Тогда мы определяем ручка ()
где происходят чудеса.
def handle(self, packet): #1 if (int(time()) != self.current_time): #2 self.current_time = int(time()) #3 self.allowance = self.capacity #3 if (self.allowance < 1): #4 return self.drop_callback(packet) #5 self.allowance -= 1 #6 return self.forward_callback(packet) #6
ручка
Принимает только 1 параметр: пакет.- Проверьте, если мы находимся в текущем временном кадре или нет.
- Если мы не в текущих временных рамках, обновите
Current_time
и сброситьразрешение
. - Проверьте, если у нас осталось какое-либо пособие.
- Снимите пакет, если у нас не осталось никакого пособия.
- В этой части мы уже знаем, что осталось пособие, поэтому мы удаляем один из пособия и пересылаю пакет.
Как видите, фиксированное окно чрезвычайно прост. Это последний код:
from time import time, sleep class FixedWindow: def __init__(self, capacity, forward_callback, drop_callback): self.current_time = int(time()) self.allowance = capacity self.capacity = capacity self.forward_callback = forward_callback self.drop_callback = drop_callback def handle(self, packet): if (int(time()) != self.current_time): self.current_time = int(time()) self.allowance = self.capacity if (self.allowance < 1): return self.drop_callback(packet) self.allowance -= 1 return self.forward_callback(packet) def forward(packet): print("Packet Forwarded: " + str(packet)) def drop(packet): print("Packet Dropped: " + str(packet)) throttle = FixedWindow(1, forward, drop) packet = 0 while True: sleep(0.2) throttle.handle(packet) packet += 1
Вы должны получить что-то подобное:
Packet Forwarded: 0 Packet Dropped: 1 Packet Dropped: 2 Packet Forwarded: 3 Packet Dropped: 4 Packet Dropped: 5 Packet Dropped: 6 Packet Dropped: 7 Packet Forwarded: 8 Packet Dropped: 9 Packet Dropped: 10 Packet Dropped: 11 Packet Dropped: 12 Packet Forwarded: 13
В вышеупомянутом коде мы создали ограничитель скорости со скоростью одного пакета в секунду. Затем мы отправляем пакет каждые 0,2 секунды, чтобы увидеть ограничитель скорости сделать его вещь.
Этот алгоритм довольно полезен, чтобы узнать о ограничивании скорости, но мы редко видим это в дикой природе, так как он позволяет взрывать события в начале временных кадров Но это действительно зависит от вашего приложения.
Спасибо за уделенное время.
Ограничение скорости (3 часть серии)
Оригинал: “https://dev.to/satrobit/rate-limiting-using-the-fixed-window-algorithm-2hgm”