Материал проходит вычитку — возможны неточности.
Урок 12 из 118

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
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Пул соединений с БД на 20 — это concurrency или rate limit?

Вопрос 2 из 3

Семафор на 10 при быстрых операциях (1 мс) против квоты 100/мин. Хватит?

Вопрос 3 из 3

Rate limiter на 10/сек при операциях по 2 секунды. Что происходит?

Итоги

Семафор — «сколько сейчас», rate limiter — «сколько в секунду». Для соединений — первое, для квот — второе. Перепутал — получил либо перегрузку, либо копящиеся горутины.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки