TGViewer
Java Ready | Программирование Java Ready | Программирование @java_ready · 9.25K subscribers
Post #2054 1.1K
Делаем простой rate limiter!

Иногда нужно ограничить частоту действий: отправку писем, запросы к API, попытки входа или запуск тяжёлой операции. Соберём простой limiter, который разрешает не больше N действий за небольшой промежуток времени.

Для хранения времени запросов подойдёт очередь:
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayDeque;
import java.util.Deque;


Создадим класс:
public class RateLimiter {
private final int limit;
private final Duration window;
private final Deque<Instant> calls = new ArrayDeque<>();


Конструктор:
    public RateLimiter(int limit, Duration window) {
this.limit = limit;
this.window = window;
}


Главный метод будет возвращать true, если действие разрешено:
    public boolean allow() {
Instant now = Instant.now();
Instant border = now.minus(window);

while (!calls.isEmpty() && calls.peekFirst().isBefore(border)) {
calls.removeFirst();
}


Если в окне уже слишком много вызовов, блокируем:
        if (calls.size() >= limit) {
return false;
}

calls.addLast(now);
return true;
}
}


Теперь можно ограничить, например, 3 попытки за 10 секунд:
RateLimiter limiter = new RateLimiter(
3,
Duration.ofSeconds(10)
);


Использование:
if (limiter.allow()) {
System.out.println("Запрос выполнен");
} else {
System.out.println("Слишком много запросов");
}


Такой limiter хранит только актуальные вызовы внутри окна. Старые записи постепенно удаляются из очереди.

Для многопоточного кода метод allow() стоит синхронизировать:
public synchronized boolean allow() {
// та же логика
}


Rate limiter это простой, но очень полезный паттерн для API, авторизации, фоновых задач и защиты от слишком частых действий.

👉 Java Ready | #практика
  • ❤ 5
  • 👍 3
  • 🔥 3
More from @java_ready
  1. Oct 6, 2026Безопасная настройка retry для всей системы! В статье Java-разработчик делится опытом внед…
  2. Oct 5, 2026Почему после Stream.toList() нельзя добавить элемент? При работе со Stream часто нужно соб…
  3. Oct 5, 2026Как оплачивать зарубежные сервисы в 2026 году? Можно бегать между посредниками и бояться б…
  4. Oct 5, 2026Находим три самых популярных товара! Есть поток покупок с повторяющимися названиями. Постр…
  5. Oct 2, 2026photo post
  6. Oct 1, 2026Следим за появлением файлов в папке через WatchService! Создадим наблюдатель и зарегистрир…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →