Инициатива OpenBlocks — это проект с открытым исходным кодом, целью которого является предоставить открытые и масштабируемые решения уровня предприятия.
Сервис "Ограничитель запросов" предоставляет возможность ограничить количество запросов, отправляемых к какому-то ресурсу в единицу времени.
Сервис спроектирован для применения в составе информационных систем, к нему должны обращаться другие сервисы, чтобы определить, не ограничен ли доступ к какому-то ресурсу.
Механизм распределенного ограничения доступа основывается на алгоритме Token bucket, по которому раз в единицу времени на ресурс выделяется некоторое заданное количество токенов доступа, а каждый запрос использует один токен. Если все токены исчерпались, это означает, что доступ к ресурсу ограничен до последующего выпуска новых токенов.
В дальнейшем для понятия "ограничитель ресурсов" также будет использоваться латинизированный термин "рейт-лимитер" (от англ. rate limiter — ограничитель частоты).
Обратите внимание на следующие секции в конфигурации сервиса.
rate-limiter:
limiters:
basic:
limit: 10
unit: MINUTES
test:
limit: 5
unit: SECONDS
В этом блоке заданы два рейт-лимитера, один с названием basic
и с ограничением доступа 10 раз в минуту,
другой — с названием test
и с ограничением доступа 5 раз в секунду.
Вы можете задать сколько угодно рейт-лимитеров, добавляя новые секции. Обратите внимание, каждая секция должна иметь уникальное имя, которое будет являться ключом для доступа к этому рейт-лимитеру.
- Один экземпляр сервиса с многими рейт-лимитерами. В этом случае вы можете задать в конфигурации сервиса много рейт-лимитеров и сможете обращаться к ним через API с использованием нужного ключа. Это рекомендуемый вариант для небольших систем и сравнительно небольшого (до 100) количества разделяемых ресурсов, к которым нужно ограничить частоту доступа.
- Множество экземпляров сервиса, по одному рейт-лимитеру на экземпляр. В этом случае предполагается, что на каждый ресурс, к которому нужно ограничить частоту доступа, вы будете разворачивать отдельный экземпляр сервиса "Ограничитель запросов". Этот вариант больше подходит для высоконагруженных систем, для которых необходимо минимальное время отклика от рейт-лимитера.
- Множество экземпляров сервиса, по многу рейт-лимитеров на сервис. Это подходящий сценарий развертывания для ситуации, когда вам требуется ограничивать доступ к тысячам и десяткам тысяч ресурсов. Вы можете распределить ограничиваемые ресурсы между разными экземплярами сервиса.
GET /api/v1/rate-limits/{limiterName}
Проверяет возможность обращения к ресурсу по ключу рейт-лимитера — limiterName
. Например, для рейт-лимитера
"basic" значение параметра будет равно "basic".
Возвращает true
, если доступ возможен, и false
, если доступ временно ограничен.