|
Rate limiting — важный механизм для контроля использования ресурсов и поддержания качества сервиса. Go элегантно поддерживает rate limiting с помощью горутин, каналов и тикеров. |
|
![]()
|
|
|
|
|
|
|
Сначала рассмотрим базовый rate limiting. Допустим, мы хотим ограничить обработку входящих запросов. Будем обслуживать эти запросы из одноимённого канала. |
|
|
Канал |
|
|
Блокируясь на получении из канала |
|
|
Возможно, мы захотим разрешить короткие всплески
запросов в нашей схеме rate limiting, сохраняя
при этом общий лимит. Этого можно добиться с помощью
буферизации канала-лимитера. Этот |
|
|
Заполняем канал для представления разрешённых всплесков. |
|
|
Каждые 200 миллисекунд мы будем пытаться добавить
новое значение в |
|
|
Теперь имитируем ещё 5 входящих запросов. Первые
3 из них воспользуются возможностью всплеска
|
|
|
Запустив программу, мы видим, что первая партия запросов обрабатывается каждые ~200 миллисекунд. |
|
|
Для второй партии запросов мы обслуживаем первые 3 немедленно благодаря возможности всплеска, а затем обслуживаем оставшиеся 2 с задержкой ~200ms каждый. |
|
Далее: Атомарные счётчики.