RateLimit (RL) нужен для обеспечения доступности сервиса. Если нагрузка на сервер создается неравномерно, то в период всплеска уязвленными могут оказаться другие клиенты сервиса. Чтобы распределить ресурсы равномерно между всеми клиентами, применяются разные подходы и самый простой из них - это RL на базе Token bucket алгоритма
Token bucket проще всего представить в виде обычного ведра с жетонами. Представим парковку. Каждой новой машине выдается жетон. Если жетонов (токенов) не осталось, то машина ожидает пока другая машина покинет парковку, вернув в ведро жетон. В этом примере есть обратная связь - ведро пополняется, когда машина получит услугу полностью. В случае же с запросами обратной связи нет, т.е. ведро с жетонами пополняется с определенной частотой независимо ни от чего. Если в какой-то момент времени на сервер прийдет много запросов, то следующему запросу уже нечего будет назначать - жетонов/токенов нет.
Как это работает в Traefik-прокси? Входящие запросы группируются по IP-адресу,
либо HTTP-заголовку. Для RL Traefik используется экспериментальный пакет
golang.org/x/time/rate
и Reserve
подход, при котором резервируется токен в будущем,
но возвращается время до его фактической резервации (напомню, что ведро с токенами пополняется с фиксированной
частотой). Если время будущей резервации слишком велико, то Traefik возвращает статус код 429 Too Many
Requests
и заголовки Retry-After
(секнуды) и X-Retry-In
(строковое
представление длительности, например, 72h3m0.5s
).
Для чего мне RL? Я поднял временно песочницу для клиента на работающем сервере (по моим ощущениям эта песочница поднята "для вида", а воспользуются ей всего несколько раз) и не хочу, чтобы абьюз этой тестовой среды сказался на основных сервисах.
Для меня было небольшим открытием, что в Linux есть два сигнала, которые процесс не может перехватить или
заблокировать - это SIGSTOP
(19) и SIGCONT
(18). Первый останавливает процесс,
а второй - возобновляет:
$ kill -19 PID $ kill -18 PID
Сервис позволяет оценить упущенные возможности: исправления, улучшения, уязвимости.
Возможная замену старому доброму mc
.