API
Rate limiting: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает решение по дизайну, которое ты принимаешь под реальным трафиком — не определение для заучивания, а компромисс, который надо взвесить, когда клиент долбит твою границу сразу через шесть нод.
Убедись, что связываешь выбор алгоритма, поведение всплесков, ловушку распределённого счётчика, атомарность и контракт 429 — тот синтез, к которому вёл урок.
Лимит 100/мин на fixed window с ключом {key}:{minute}. Сколько запросов клиент в худшем случае легально уложит в промежуток ~1 секунда и почему?
Публичный API обслуживает бёрстовых браузерных клиентов — загрузка страницы выстреливает ~12 запросов разом, затем простой. Нужен честный средний rate, терпящий эти бёрсты загрузки. Какой алгоритм подходит лучше?
In-memory лимитер проходит все тесты на ноутбуке, но в production трафик идёт сильно выше настроенных 100/мин. За балансировщиком четыре app-ноды. Корневая причина?
Ты переносишь счётчик в Redis и реализуешь как INCR, затем EXPIRE. Почему единый Lua-скрипт — более надёжный паттерн?
Сервис аутентификации должен держать точный пер-аккаунт лимит ради compliance — без граничного зазора, каждая попытка учтена. Какой алгоритм и какую цену ты принимаешь?
На fixed window ты отклоняешь с 429 и жёстким Retry-After 30 секунд. На следующей границе окна error rate снова взлетает. Что произошло и какой фикс?
Сквозная линия: то, как запросы попадают в окна, — это где fixed window протекает 2x граничным всплеском; sliding window log покупает точность памятью на запрос, sliding counter аппроксимирует её за два integer, а token bucket моделирует всплески как настраиваемый capacity. Ничего из этого не реально, если счётчик живёт в пер-нодовой памяти — раздели его в Redis, сделай read-decide-update атомарным через Lua, а отклоняя — соблюдай контракт: 429 + Retry-After в delta-seconds плюс jitter, чтобы граница сброса не стала thundering herd.