Как установить максимальное количество разрешений для распределенной блокировки 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);
        }
Другие вопросы по тегам