Concurrency limit vs rate limit
Внешний API распознавания документов ответил 429 «слишком часто». Миша поставил семафор на десять одновременных вызовов — 429 продолжал прилетать: пределов оказалось два, и он ограничивал не тот.
семафор ограничивает, сколько операций идёт одновременно, а rate limiter — сколько происходит в секунду; это разные ресурсы, и путать их нельзя.
Два разных вопроса
- Concurrency limit: «сколько одновременно» — защищает ресурс, который занят, пока операция идёт: соединения с БД, дисковые операции, память.
- Rate limit: «сколько в единицу времени» — защищает ресурс, который «переваривает» с ограниченной скоростью: внешний API с квотой, очередь, бюджет.
Семафор на 10 даёт «не больше 10 одновременно» — но не мешает прогнать 10 000 операций за секунду, если они быстрые. Rate limiter на 10/сек даёт «не больше 10 в секунду» — но не мешает всем десяти идти одновременно.
Чем чревато перепутать
Если поставить семафор там, где нужен rate limit, — внешний API всё равно утонет в запросах: операции быстрые, 10 «окон» прокручиваются сотни раз в секунду. Если поставить rate limiter там, где нужен concurrency limit, — медленные операции будут копиться: лимитер пропустил 10 в секунду, а выполняются они дольше секунды — горутины накапливаются, память растёт.
Что выбрать для своего сервиса
Вопрос для каждого дефицитного ресурса один: «он занят, пока операция длится, или он лимитирован по скорости?». Соединение с БД занято — семафор. Квота внешнего API считается в секундах — rate limiter. Часто нужны оба, но в разных местах.
Вы узнаете:
- как реализовать простой rate limiter
- как комбинировать семафор и лимитер для внешних API
Проверьте себя
Пул соединений с БД на 20 — это concurrency или rate limit?
Семафор на 10 при быстрых операциях (1 мс) против квоты 100/мин. Хватит?
Rate limiter на 10/сек при операциях по 2 секунды. Что происходит?
правильных ответов
Семафор — «сколько сейчас», rate limiter — «сколько в секунду». Для соединений — первое, для квот — второе. Перепутал — получил либо перегрузку, либо копящиеся горутины.
10 000 ₽ · 60 минут · онлайн