Подойдёт общий Semaphore с 10 permits: каждый вызов захватывает разрешение и освобождает его после завершения. Это ограничение параллельности, а не числа запросов в секунду.
Если у нас есть внешний API, который разрешает максимум 10 одновременных подключений, какой класс из пакета java.util.concurrent ты бы использовал, чтобы ограничить число параллельных вызовов?
Подойдёт общий Semaphore с 10 permits: каждый вызов захватывает разрешение и освобождает его после завершения. Это ограничение параллельности, а не числа запросов в секунду.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Подойдёт общий Semaphore с 10 permits: каждый вызов захватывает разрешение и освобождает его после завершения. Это ограничение параллельности, а не числа запросов в секунду.
Для блокирующего клиента:
permits.acquire(); // общий Semaphore(10)
try {
return api.call();
} finally {
permits.release();
}
acquire находится до try, чтобы не сделать лишний release при прерывании ожидания. Для ограниченного ожидания используют tryAcquire с timeout. В асинхронном клиенте permit освобождают при фактическом завершении, а не сразу после получения Future. Несколько экземпляров приложения требуют согласования общего лимита.
Источник: docs.oracle.com.