RSS Telegram YouTube Apple Яндекс Spotify Amazon Почта

78. Rate Limit & Token Bucket

16.11.2024

Скачать

К списку выпусков

Ссылки выпуска:

RateLimit для защиты от всплесков

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? Я поднял временно песочницу для клиента на работающем сервере (по моим ощущениям эта песочница поднята "для вида", а воспользуются ей всего несколько раз) и не хочу, чтобы абьюз этой тестовой среды сказался на основных сервисах.

SIGSTOP & SIGCONT

Для меня было небольшим открытием, что в Linux есть два сигнала, которые процесс не может перехватить или заблокировать - это SIGSTOP (19) и SIGCONT (18). Первый останавливает процесс, а второй - возобновляет:

$ kill -19 PID
$ kill -18 PID

Что ты теряешь на старой версии PostgreSQL?

Сервис позволяет оценить упущенные возможности: исправления, улучшения, уязвимости.

yazi - быстрый файловый менеджер для терминала

Возможная замену старому доброму mc.