Как установить максимальное количество разрешений для распределенной блокировки Redisson

У меня есть модуль 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);

person Ivan Stoyanov    schedule 14.10.2016    source источник


Ответы (1)


Итак, я нашел решение.

В Redisson есть метод addPermits, который можно использовать для добавления количества разрешений. И его следует использовать только один раз для семафора.

        // 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);
        }
person Ivan Stoyanov    schedule 17.10.2016