Как стать автором
Обновить

rate limiter (sliding window)

Время на прочтение2 мин
Количество просмотров8.6K

Наверняка многие бекенд программисты сталкивались с задачей ограничения запросов к некоторому источнику данных. Существует множество решений этой проблемы:

1) хранить историю во внешнем источнике данных, как redis. Для вычисления возможности отправить запрос, нужно каждый раз ходить в этот источник данных, что может быть непозволительно в некоторых сферах (так как существенно увеличивается время обработки запроса)

2) не париться с limiter и анализировать ответ от внешнего источника данных и на основе его ответов, принимать решение когда и сколько запросов можно отправить (но такие ответы есть не у каждого сервиса и существует вероятность, что будут отправлены лишние запросы, что может привести к бану)

3) хранить историю запросов локально, но использовать алгоритм leaked bucket, но это не позволяет накидать несколько запросов и ждать

4) хранить историю запросов локально, но использовать алгоритм sliding window, можно накидать запросов и ждать какое-то известное время

О реализации sliding window для java пойдет речь в этой статье

Пример сервиса, где нужно не превышать некоторый лимит по запросам

Цели

  • не ходить по сети куда-то во внешний сервис, чтобы узнать можно ли отправить запрос или нет (так как увеличивает время обработки запроса)

  • хотелось бы иметь библиотеку (а не создавать велосипед каждый раз)

  • можно было использовать, как в spring проектах, так и в других фреймворказ и JVM языках

Сразу хочу отметить

1) готовой библиотеки с реализацией алгоритма sliding-window для java/kotlin - не нашел

2) моя библиотека не полностью закончена (в статусе beta), но уже можно использовать в своих проектах

Примеры использования
1) сервис, который чем-то торгует. Постоянно меняются цены на те инструменты, чем вы торгуете. Вам нужно понимать, вы можете сейчас отправить запрос по данной цене (и не попасть в бан) или лучше подождать изменение цен и отправить через некоторое время. можно использовать метод executeOrThrowException(...)

2) у вас какой-то сервис аналитики (не риалтайм). периодически (например, раз 1-5 минут нужно обновлять какие-то данные). с помощью моей либы, вы можете не создавать сложную архитектуру приложения и на клиенте в бесконечном цикле дергать executeOrWait(...), при этом не положить внеший сервис с данным из-за частых запросов

Моя библиотека

Если есть какие-то советы по улучшению библиотеки, лучше сразу создавайте issues или PR.

Ставьте звезды - так буду понимать, что библиотека интересна и стоит дальше развивать.

P.S.: первая статья на Хабре.
Хорошая статья о sliding window

Теги:
Хабы:
Всего голосов 19: ↑3 и ↓16-12
Комментарии18

Публикации

Истории

Работа

Java разработчик
443 вакансии

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань