Dans mon article précédent, j’ai évoqué mon intervention rapide sur un projet utilisant un pool de Thread qui était mal géré. J’étais intervenu pour permettre de prioriser certaines tâches dans ce pool de Thread. Néanmoins, il y avait un autre souci, moins grave que le premier, (enfin pour le client) comme le volume assez conséquent de tâche. En Production, le pool de Thread était configuré à 5 tâches consécutives qui duraient plusieurs secondes chacune (allant même à une minute pour certaines). Toutes les 5 minutes, les tâches étaient injectées dans ce pool de Thread, par conséquent, on était régulièrement à 4000 tâches en attente en continu. Une grosse quantité de tâche arrivait toutes les 5 minutes pendant l’exécution des autres tâches déjà présentes dans la file d’attente, la file d’attente n’est jamais totalement dépilée. J’ai constaté rapidement en monitorant la production que de nombreuses tâches qui étaient en attente dans le pool de Thread étaient remises dans ce même pool au prochain cycle d’ajout, c’est à dire toutes les 5 minutes.
Pour diminuer ce volume, il y a 2 solutions possibles :
- Ré-implémenter le système permettant de rajouter les tâches et ré-implémenter les tâches elles-mêmes qui sont beaucoup trop longues à s’exécuter. Bien sûr cette solution est trop coûteuse à réaliser car il faudrait tout réécrire et plusieurs développeurs étant déjà passés dessus, tout refaire est un aveu d’échec pour le client et c’est difficilement explicable à leur direction d’avoir perdu de l’argent sur plusieurs mois de développement.
- La seconde solution, la plus rapide (donc le client est content), est de vérifier au moment de l’ajout de la tâche dans le pool de Thread si cette tâche est déjà présente.
C’est la seconde solution qu’on va réaliser en utilisant un décorateur, cela va nous permettre de rajouter des fonctionnalités supplémentaires à notre pool de Thread.