2009-09-17 5 views
12

J'écris une application de serveur Java assez complexe qui a une partie significative de traitement d'arrière-plan en plus du traitement de demande-réponse habituel. Une partie du traitement en arrière-plan est faite de façon cron à l'aide du cadre Quartz. D'autres tâches sont plus à la demande - si un nouveau client se connecte, il crée un travail supplémentaire pour la mise à jour de temps en temps. Les tâches cron peuvent également être variées - certaines surveillent les applications externes, d'autres calculent les statistiques, etc.Un ou plusieurs pools de threads pour le serveur Java?

J'utilise un certain nombre de pools de threads pour exécuter toutes ces tâches avec l'idée que des tâches similaires partageront un pool de threads, mais que des tâches différentes n'en partageront pas. Par exemple, les tâches de surveillance ne seront jamais exécutées sur le pool de statistiques et les tâches statistiques ne seront jamais exécutées sur le pool de surveillance. D'autre part, je sais que certaines personnes préféreraient simplement avoir un seul pool de threads et tout faire fonctionner sans séparation.

Je me demande ce qui est considéré comme la meilleure pratique dans un tel scénario. Quels sont les avantages et les inconvénients de la séparation des pools de thread?

Cela importe-t-il même?

+2

+ 1 question intéressante. – KLE

Répondre

0

Il n'y a pas vraiment une réponse directe, mais une autre proposition :-(

Vos travaux de quartz peuvent être mis en pause, annulés et ainsi de suite, nous allons l'appeler « géré ». Je suppose que vous allez créer une interface utilisateur à les gérer.

Est-ce que vous vous rendez compte que vous vos autres emplois (« à la demande ») ne bénéficieront pas des mêmes fonctionnalités, à moins que vous le mettre en œuvre bien sûr? Avez-vous pensé faire tout un travail de quartz (même si elle commence immédiatement), pour obtenir un code uniforme?

+0

En fait, c'est l'une des options. Il y a deux problèmes cependant - l'un est que AFAIK Quartz oblige à utiliser un seul pool de threads - alors que ma préférence personnelle est d'utiliser plusieurs. La deuxième est que l'API Quartz est géniale à partir des tâches de type cron mais lourde lorsque vous avez juste besoin d'exécuter rapidement un algorithme en parallèle. –

+0

@Gregory Je comprends votre préoccupation pour le nombre de threads. Je n'ai aucune recommandation à faire sur ce point :-(A propos de la lourde Quartz, c'est exactement ce que j'ai ressenti quand j'ai travaillé avec elle :-) J'ai encapsulé cela dans une méthode simple faite maison. – KLE

+0

Pour être franc, nous avons aussi des problèmes avec Quartz sur un cluster. Le travail commence n'importe où, pas sur le serveur qui traite la demande.Je pense que Quartz est démarré sur le premier nœud qui est en place, et que les autres nœuds ne le démarrent pas. Cela conduit à plusieurs problèmes ... – KLE

6

La réponse dépend de la nécessité ou non de séparer les ressources d'application entre différents types d'activité. Par exemple, j'écris actuellement une application serveur composée de quelques auteurs à haut débit et potentiellement de nombreux lecteurs. Les lecteurs accèderont à l'application de manière sporadique, mais pourraient potentiellement demander beaucoup de données (c'est-à-dire des demandes de longue durée). Je dois m'assurer que les écrivains ne sont jamais affamés, donc je vais utiliser deux pools de threads dans ma conception pour lire/écrire. Si le pool de threads du lecteur est temporairement épuisé, les rédacteurs ne seront pas affectés; seules les demandes de lecture seront retardées.

Une alternative aurait été d'utiliser un PriorityQueue en conjonction avec un ThreadPoolExecutor et d'attribuer une priorité plus élevée aux demandes d'écriture. Donc, en conclusion - Mon conseil serait: Commencez avec un pool de threads et ne faites que rendre votre design plus complexe s'il y a une raison concrète de le faire.

Questions connexes