Рубрики
Без рубрики

Ограничение скорости с использованием алгоритма фиксированного окна

Реализуйте алгоритм ограничения скорости, называемого фиксированным окном в Python. Теги с учебником, компьютером, Python, программированием.

Ограничение скорости (3 часть серии)

В предыдущем посте мы прошли ограничение по ставкам и что это такое. Затем мы представили алгоритм под названием ведро токена и реализовали его в Python.

Я решил превратить это в серию и посвятить каждый пост алгоритму.

И в этом посте мы узнаем о фиксированном окне и его реализации в Python.

Фиксированное окно

Как следует из названия, это все о Windows. В этом алгоритме мы разделим время в фиксированные окна, а затем отобразите входящие события в эти окна.

Сам алгоритм довольно прост без аналогии, но давайте начнем с одного в любом случае.

Представьте себе движущийся поезд. Есть ворота и в любой момент, люди могут доскамиться только одного вагона (Да, люди насаждают движущийся поезд, ничего странного).

Предположим, что окно посадки для каждого вагона составляет 1 минуту. Так что, если вагон полностью, вам нужно ждать до минуты для следующего вагона.

В этой аналогии поезд – это время! Время всегда движется вперед и в каждом временном кадре, у нас есть фиксированное окно прохождения.

В этой очень простой реализации мы создадим ограничитель скорости, который использует фиксированное окно для ограничения пакетов в 1-секундные рамы времени.

Начнем с определения класса с 3 аргументами, когда оно призвано.

  1. Емкость: Количество разрешенных пакетов, которые могут пройти через секунду.
  2. Forward_Callback: Эта функция называется, когда пакет пересылается.
  3. 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. ручка Принимает только 1 параметр: пакет.
  2. Проверьте, если мы находимся в текущем временном кадре или нет.
  3. Если мы не в текущих временных рамках, обновите Current_time и сбросить разрешение .
  4. Проверьте, если у нас осталось какое-либо пособие.
  5. Снимите пакет, если у нас не осталось никакого пособия.
  6. В этой части мы уже знаем, что осталось пособие, поэтому мы удаляем один из пособия и пересылаю пакет.

Как видите, фиксированное окно чрезвычайно прост. Это последний код:

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”