0

J'ai un module Java, qui est exécuté avec AWS Lambda. Cela signifie que plusieurs instances du module peuvent être exécutées en même temps.Comment définir le nombre maximal de permis pour le verrou distribué Redisson

Le module est utilisé pour accéder à une API donnée et en récupérer des données. Le problème est que l'API utilise un algorithme de compartiment perméable, qui limite les appels d'API à 40 et un appel API est rendu disponible toutes les 0,5 secondes. Pour cette raison, j'obtiens une exception Request limit exceeded.

Pour résoudre ce problème, j'ai décidé d'implémenter un verrou distribué et d'utiliser redisson avec AWS ElastiCache (cluster Redis distribué). Après avoir vérifié la documentation du redisson, j'ai conclu que je devrais utiliser un PermitExpirableSemaphore qui peut créer un verrou avec un bail (dans mon cas 500 ms).

Le problème est que je ne peux pas trouver un moyen de limiter les permis disponibles à 40.

Connaissez-vous une façon de le faire?

Voici un exemple de mon code:

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); 

Répondre

0

I Alors trouvé la solution.

Il existe une méthode addPermits dans Redisson, qui peut être utilisée pour ajouter le nombre de permis. Et il devrait être utilisé seulement une fois pour un sémaphore.

 // 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); 
     }