Как установить максимальное количество разрешений для распределенной блокировки Redisson
У меня есть модуль Java, который работает с AWS Lambda. Это означает, что несколько экземпляров модуля могут быть запущены одновременно.
Модуль используется для доступа к определенному API и получения данных из него. Проблема заключается в том, что API использует алгоритм утечки, который ограничивает вызовы API до 40, а вызов API делается доступным каждые 0,5 секунды. Из-за этого я получаю Request limit exceeded
исключение.
Чтобы это исправить, я решил внедрить распределенную блокировку и использовать редиссон с 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);
1 ответ
Итак, я нашел решение.
Там есть addPermits
метод в Redisson, который можно использовать для добавления количества разрешений. И это должно быть использовано только один раз для семафора.
// If there are no permits set this will throw a NullPointerException.
// This means that the permits should be added. If the addPermits is executed more than once,
// each consecutive call will add the permits to the existing ones. eg: 35, 70, etc.
try
{
int permits = _semaphore.availablePermits();
}
catch (NullPointerException ex)
{
_semaphore.addPermits(35);
}