2
votes

ExecutorService utilisant une API de repos

J'ai une API qui effectue quatre tâches. Si nous procédons de manière séquentielle, cette API prendra plus de temps.
Pour augmenter les performances, j'ai utilisé le cadre du service Executor et soumis quatre tâches à l'aide du service executor.

Comme je le sais, créer un thread est une opération coûteuse, et dans le service exécuteur, le thread sera créé au moment de la soumission des tâches. Et les threads seront détruits lorsque nous appelons la méthode shutdown du service exécuteur.

Voici le processus de chaque demande dans ce scénario:

  1. Appel API
  2. créer un service d'exécuteur
  3. soumettre les quatre tâches futures
  4. Créez la réponse à partir de tous les threads de retour.
  5. appelez la méthode de service de l'exécuteur d'arrêt.
  6. renvoyer la réponse

Ma question est donc de créer un service exécuteur et des threads dans chaque requête est-il correct ou non? Ou s'il vous plaît laissez-moi savoir une solution alternative à ce problème.


0 commentaires

3 Réponses :


-1
votes

Créez un singleton de votre ExecutorService et utilisez cette même instance pour toutes les requêtes. NE le créez PAS encore et encore. Vous devez également limiter le nombre maximum de threads appartenant à ExecutorService pour empêcher votre API REST de faire exploser votre serveur.


0 commentaires

2
votes

Non, il n'est pas judicieux de terminer et de ré-instancier ExecutorService fréquemment. C’est l’intérêt. Créez un pool de threads fixe car vous connaissez déjà le nombre de tâches que vous souhaitez effectuer en parallèle. Découpez également votre gestionnaire de requêtes de la création d'ExecutorService. Notez que vous appelez shutdown (), c'est-à-dire que vous terminez les tâches en cours et n'acceptez aucune nouvelle tâche, ce n'est pas réutilisable, cela vous oblige à rétablir le pool par requête, alors essayez de ne pas mettre fin au pool de threads.


0 commentaires

2
votes

Il est parfaitement normal d'utiliser un pool de threads pour paralléliser le traitement des requêtes entrantes. Mais ce n'est pas bien de créer un nouveau pool de threads à chaque appel d'API.

Pour ce faire correctement, vous devez créer une instance ExecutorService distincte et simplement la réutiliser et l'arrêter uniquement lorsque vous arrêtez l'application.

N'oubliez pas non plus de le dimensionner correctement car s'il est saturé, cela dégradera votre latence au lieu de l'améliorer.


5 commentaires

Si je crée un service exécuteur avec quatre threads, avant que la demande ne vienne. Pendant plusieurs appels à l'API, le premier appel utilisera les quatre threads pour exécuter les quatre tâches, et pendant ce temps, toutes les autres demandes seront en attente.


Oui, c'est pourquoi j'ai ajouté une note sur le dimensionnement correct.


Le fait que j'accepte que la création et la destruction du service exécuteur dans chaque appel d'API soit erroné. Le dimensionnement du pool de threads dans ce scénario n'est pas facile, ou l'exécuteur du pool de threads n'est-il pas adapté à ce contexte? Parce que, par exemple, si nous atteignons l'API de repos 1000 fois, quelle sera la taille du pool de threads, ou si ce nombre augmente à 10 millions, quelle sera la taille du pool de threads.


@DeepakGusain en fait, c'est assez facile si vous connaissez les exigences non fonctionnelles du service


Il vaut mieux saturer le ExecutorService que de consommer 100% de ressources cpu et de dégrader les performances de l'ensemble du système.