У меня есть модуль Java, который запускается с помощью AWS Lambda. Это означает, что несколько экземпляров модуля могут быть запущены одновременно.
Модуль используется для доступа к определенному API и извлечения данных из него. Проблема в том, что API использует алгоритм дырявого ведра, который ограничивает количество вызовов API до 40, а вызов API доступен каждые 0,5 секунды. Из-за этого я получаю исключение Request limit exceeded
.
Чтобы исправить это, я решил реализовать распределенную блокировку и использовать redisson с AWS ElastiCache (распределенный Redis). кластер). Проверив документацию redisson, я пришел к выводу, что мне следует использовать PermitExpirableSemaphore
, который может создать блокировку с арендой (в моем случае 500 мс).
Проблема в том, что я не могу найти способ ограничить доступные разрешения до 40.
Вы знаете способ сделать это?
Вот пример моего кода:
Config config = new Config();
config.useElasticacheServers()
.setScanInterval(2000) // cluster state scan interval in milliseconds
.addNodeAddress("my.cache.amazonaws.com:6379");
RedissonClient redissonClient = Redisson.create(config);
RPermitExpirableSemaphore semaphore = redissonClient.getPermitExpirableSemaphore("mySemaphore");
String permitId = semaphore.acquire(500, TimeUnit.MILLISECONDS);
// Make the API call
semaphore.release(permitId);