Реализация базового ограничителя скорости в Java
У меня было требование о внедрении базового ограничения скорости для простого API (с максимумом 40- 50 запросов в день) в Java. Требование: IP-адрес должен быть ограничен до N в M секундах (например, 10 запросов за 60 секунд) Вот что я сделал: использовал фильтр и логика была следующая: Подход 1: использовал cache2k для сохранения IP-адреса и pojo с подсчетами и временем последнего доступа
поставить каждый ip как ключ и pojo как значение (у pojo есть такие поля, как:count, последний доступ.)
когда приходит запрос, проверьте ip в кеше,
если ip не получен, вставьте в кеш: ключ: значение ip:pojo с номером 1 и последним обращением в качестве текущей даты.
если ip получен, проверьте дату последнего доступа.
если разница между временем последнего доступа и текущим временем составляет> M секунд, это означает, что запросы от этого ip не поступали в течение более чем M секунд. создайте новое Pojo с номером 1 и последним доступом в качестве текущей даты и вставьте в кеш
если разница
если счетчик
если count = N, отфильтруйте запрос - не разрешайте запрос
Подход 2:
Установите время истечения срока действия кэша как M секунд:
Проверьте, есть ли запись в кеше или нет.
- Если нет, введите ключ как ip и значение как count(1)
- если да, проверьте счет,
- если count = N, то не разрешать
- иначе вставьте значение с обновленным счетчиком и разрешите запрос
Я не хочу слишком усложнять использование Guava для простого приложения.
Было бы здорово, если кто-то может дать предложения.
Спасибо,