Реализуйте thread-safe RateLimiter: не более 5 запросов в секунду для одного userId, метод isAllowed(String userId).

Для реализации rate limiting по RPS (requests per second) к внешнему API в Java можно использовать различные подходы:

Короткий ответ

Что ответить на собеседовании

Для реализации rate limiting по RPS (requests per second) к внешнему API в Java можно использовать различные подходы:

Подробный разбор

Ответ с пояснениями

Для реализации rate limiting по RPS (requests per second) к внешнему API в Java можно использовать различные подходы:

  1. Token Bucket или Leaky Bucket — классические алгоритмы ограничения частоты запросов. Например, с помощью библиотеки Guava RateLimiter:
import com.google.common.util.concurrent.RateLimiter;

RateLimiter rateLimiter = RateLimiter.create(10.0); // 10 запросов в секунду

public void callApi() {
    rateLimiter.acquire(); // блокирует, пока не будет разрешено
    // вызов внешнего API
}
  1. Собственная реализация с использованием ScheduledExecutorService — можно считать количество запросов за секунду и блокировать или откладывать вызовы.
  2. Использование сторонних библиотек — например, Resilience4j, которая поддерживает rate limiting и другие паттерны устойчивости.

Отличия виртуальных потоков (корутин) от системных потоков:

  • Системные потоки (OS threads) — это потоки, управляемые операционной системой. Они имеют собственный стек, контекст переключения между ними дорогой по ресурсам, и их количество ограничено ресурсами ОС.
  • Виртуальные потоки (например, Project Loom в Java) — легковесные потоки, управляемые JVM, а не ОС. Они позволяют создавать тысячи и миллионы параллельных задач с низкими затратами памяти и переключения контекста.
  • Корутины — концепция легковесных потоков, поддерживаемая на уровне языка (например, Kotlin). Они позволяют приостанавливать и возобновлять выполнение без блокировки системного потока.

Ключевые отличия:

  • Виртуальные потоки и корутины более эффективны по памяти и CPU.
  • Виртуальные потоки интегрируются с существующим API потоков Java.
  • Корутины требуют поддержки на уровне языка и компилятора.

Таким образом, виртуальные потоки позволяют масштабировать параллелизм без значительных накладных расходов, что особенно полезно для IO-bound задач, таких как вызовы внешних API.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее