Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

Création d'une file d'attente


Sujet :

Développement Web en Java

  1. #1
    Membre à l'essai
    Création d'une file d'attente
    Bonjour,

    Voici ma problématique :

    Je travail sur le développement d'un logiciel en Saas.
    Lors de son utilisation, des requêtes vont être envoyées à un web service par plusieurs utilisateurs, parfois en même temps. Seulement ce web service n'accepte que 20 requêtes par minute.

    Mon idée est donc de faire une file d'attente qui va stocker les requêtes des utilisateurs, les envoyer une à une jusqu'à 20, puis faire une pause pendant une minute avant de reprendre.

    Pour le moment voici la solution que j'ai mis en place :

    Dans ma classe principale j'instancie un singleton qui lui même instancie une LinkedTransferQueue et un compteur.
    Les requêtes envoyées par les utilisateurs sont reçu dans ma classe principale sous forme de Vector.
    Chaque fois qu'une utilisateur envoie des requêtes, j'appelle une méthode du singleton qui reçoit en paramètre le Vector. Cette méthode crée un Thread qui remplit le LinkedTransferQueue avec le contenu du Vector.
    Ensuite, j'appelle une seconde méthode du singleton qui crée un Thread qui va lire le LinkedTransferQueue, envoyer une requête, incrémenter le compteur et ainsi de suite. Au bout de 20 requêtes envoyées, je fais un Thread.sleep(60000) puis je remets le compteur à 0.

    Je ne suis pas du tout sur de ma façon de faire. En plus, si le compteur est par exemple à 14 et qu'il n'y a pas de requêtes envoyées pendant un certain temps, le compteur va rester à 14 et du coup, seulement 6 requêtes vont être envoyées la prochaine fois avant de faire la pause d'une minute.

    Quelle(s) solution(s) et conseil(s) pouvez-vous m'apporter ?

    Merci d'avance.

  2. #2
    Membre habitué
    Salut,

    Dans une des libraries de Google, il existe un objet RateLimiter qui je pense fera parfaitement l'affaire dans ton scenario :
    API : https://guava.dev/releases/19.0/api/docs/index.html?com/google/common/util/concurrent/RateLimiter.html
    Tutorial : https://www.baeldung.com/guava-rate-limiter

    Tu devra sans doute restreindre le nombre de requetes entrantes dans ton systeme car ta queue n'est pas extensible a l'infini (Ta limite etant la quantite de memoire disponible pour ton programme).

    Je pense egalement qu'utiliser un thread different pour inserer les elements d'un vector dans ta queue n'est pas indispensable.
    Quoi qu'il en soit tu devras utiliser un nombre de threads fixe que sera au maximum le nombre de cores disponibles pour ton programme, recuperable par le code :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Runtime.getRuntime().availableProcessors()

    et de preference geres a l'aide d'un Executor : https://www.baeldung.com/java-executor-service-tutorial

    Good luck !