Выбор ответа Middle Паттерны конкурентности обновлено

Ограничение частоты запросов

Вопрос

Нужно отправлять во внешний API не больше 10 запросов в секунду с допустимым всплеском до 20. Какой инструмент подходит лучше?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: rate.NewLimiter(10, 20) и limiter.Wait(ctx) перед запросом. Limiter реализует токен-бакет: 10 токенов в секунду, ёмкость 20, Wait блокирует до появления токена с учётом ctx.

Варианты ответа

  1. time.Sleep(100 * time.Millisecond) перед каждым запросом
  2. Семафор на 10 горутин: больше 10 в секунду не уйдёт
  3. rate.NewLimiter(10, 20) и limiter.Wait(ctx) перед запросомправильный ответ
  4. time.NewTicker(10 * time.Second) и запрос на каждый тик

Разбор

Limiter реализует токен-бакет: 10 токенов в секунду, ёмкость 20, Wait блокирует до появления токена с учётом ctx. Sleep в каждой горутине не ограничит суммарную частоту при нескольких горутинах и не даёт всплесков. Семафор ограничивает число одновременных запросов, а не их частоту. Тикер раз в 10 секунд выдаст 0.1 запроса в секунду.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.