Comment pouvez-vous minimiser le nombre de threads utilisés dans un serveur tcp application?

StackOverflow https://stackoverflow.com/questions/32198

Question

Je suis à la recherche pour n'importe quel de stratégies d'utilisation de personnes lors de la mise en œuvre des applications de serveur que client de service TCP (ou UDP) demandes:des modèles de conception, de mise en œuvre de techniques, bonnes pratiques, etc.

Supposons pour les besoins de cette question que les demandes sont de relativement longue durée de vie (plusieurs minutes) et que le trafic est sensible au temps, donc pas de délais sont acceptables pour répondre aux messages.Aussi, nous sommes à la fois l'entretien des demandes de clients et de nos propres connexions aux autres serveurs.

Ma plate-forme est .NET, mais depuis que la technologie sous-jacente est la même quel que soit la plateforme, je suis curieux de voir les réponses pour toutes les langues.

Était-ce utile?

La solution

L'approche moderne est d'utiliser le système d'exploitation multiplex de nombreux sockets réseau, vous laissant votre application pour le traitement des connexions actives avec le trafic.

Chaque fois que vous ouvrez un socket il est associé avec un sélecteur.Vous utilisez un seul thread à l'obtention de la sélection.Chaque fois que les données arrivent, le sélecteur indique le socket qui est actif, vous confier cette opération à un enfant de fil et continuer d'interrogation.

De cette façon, vous avez seulement besoin d'un thread pour chaque concurrente l'opération.Les Sockets qui sont ouvertes, mais d'inactivité ne sera pas attacher un fil.

Autres conseils

Plus sophosticated l'approche serait d'utiliser IO ports d'Achèvement.(Windows) Avec IO ports d'Achèvement de vous laisser le système d'exploitation pour gérer d'interrogation, ce qui permet potentiellement de très haute niveau de l'optimisation avec le pilote de carte réseau de soutien.Fondamentalement, vous avez une file d'attente des opérations de réseau qui est OS géré, et de fournir une fonction de callback qui est appelée lorsque l'opération est terminée.Un peu comme (disque Dur) DMA mais pour le réseau.

Len Holgate a écrit un eccelent série sur IO ports de fin il y a quelques années sur Codeproject:http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

Et J'ai trouvé un article sur IO ports de fin pour .net (ne l'avez pas lu tout de même) http://www.codeproject.com/KB/cs/managediocp.aspx

Je dirais aussi qu'il est facile à utiliser ports d'achèvement par rapport à essayer et écrire une évolutive alternative.Le problème, c'est qu'ils ne sont disponibles que sur NT (2000, XP, Vista)

Si vous étiez à l'aide de C++ et de la Win32 directement alors je suggère que vous lisez sur overlapped I/O et I/O ports d'Achèvement.J'ai une connexion C++, IOCP, infrastructure client/serveur avec le code source complet, voir ici pour plus de détails.

Depuis que vous utilisez .Net, vous devriez être à la recherche à l'aide de l'asynchrone méthodes socket de sorte que vous n'avez pas besoin d'avoir un thread pour chaque connexion;il y a plusieurs liens à partir de ce blogue de la mine, qui peuvent être des points de départ utiles: http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month.html (certains des meilleurs liens sont dans les commentaires du post d'origine!)

G'day,

Je voudrais commencer par regarder la métaphore que vous souhaitez utiliser pour votre thread cadre.

Peut-être "chef de file adepte" lorsqu'un thread est à l'écoute pour les demandes entrantes et lorsqu'une nouvelle demande arrive, il fait le travail et le fil suivant dans la piscine commence à écouter les demandes entrantes.

Ou le pool de threads où le même thread est toujours à l'écoute pour les demandes entrantes et puis, passant les demandes au cours de la prochaine transaction disponible dans le pool de threads.

Vous aimeriez visiter le Réacteur la section de l'As Composants pour obtenir quelques idées.

HTH.

cheers, Rob

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top