2008-08-28 11 views
4

Ich suche nach irgendwelchen Strategien Menschen benutzen, wenn Server-Anwendungen implementieren, die Service-Client-TCP (oder UDP) Anfragen: Design Patterns, Implementierungstechniken, Best Practices, usw.Wie minimieren Sie die Anzahl der in einer TCP-Serveranwendung verwendeten Threads?

die für die Zwecke dieser Frage annehmen lassen, dass die Anfragen sind relativ langlebig (mehrere Minuten) und der Verkehr ist zeitabhängig, so dass keine Verzögerungen beim Antworten auf Nachrichten akzeptabel sind. Wir bearbeiten Anfragen von Clients und stellen eigene Verbindungen zu anderen Servern her.

Meine Plattform ist .NET, aber da die zugrunde liegende Technologie unabhängig von der Plattform gleich ist, interessiert mich, Antworten für jede Sprache zu sehen.

Antwort

6

Der moderne Ansatz besteht darin, das Betriebssystem zu verwenden, um viele Netzwerk-Sockets für Sie zu multiplexen, sodass Ihre Anwendung nur aktive Verbindungen mit Datenverkehr verarbeiten kann.

Wenn Sie einen Socket öffnen, wird dieser einem Selektor zugeordnet. Sie verwenden einen einzelnen Thread, um diesen Selektor abzufragen. Wenn Daten eintreffen, zeigt der Selektor den aktiven Socket an, Sie übergeben diesen Vorgang an einen untergeordneten Thread und setzen die Abfrage fort.

Auf diese Weise benötigen Sie nur einen Thread für jede gleichzeitige Operation. Steckdosen, die offen sind, aber nicht im Leerlauf sind, binden keinen Faden.

0

G'day,

würde ich, indem man die Metapher beginnen Sie Ihren Thread Rahmen verwenden möchten.

Vielleicht "Leader Follower", wo ein Thread auf eingehende Anfragen hört und wenn eine neue Anfrage kommt, macht es die Arbeit und der nächste Thread im Pool beginnt auf eingehende Anfragen zu hören.

Oder Thread-Pool, in dem derselbe Thread immer auf eingehende Anforderungen wartet und dann die Anforderungen an den nächsten verfügbaren Thread im Thread-Pool weiterleitet.

Sie können die Reactor Abschnitt der Ace-Komponenten besuchen, um einige Ideen zu erhalten.

HTH.

prost, Rob

4

Eine sophosticated aproach wäre IO Completion Ports zu verwenden. (Windows) Mit IO-Completion-Ports überlassen Sie dem Betriebssystem die Verwaltung von Abfragen, wodurch potenziell eine sehr hohe Optimierungsebene mit NIC-Treiberunterstützung verwendet werden kann. Im Grunde haben Sie eine Warteschlange von Netzwerkoperationen, die vom Betriebssystem verwaltet wird und eine Rückruffunktion bereitstellt, die beim Abschluss der Operation aufgerufen wird. Ein bisschen wie (Festplatte) DMA, aber für das Netzwerk.

Len Holgate schrieb eine eccelent Serie auf IO-Ports Abschluss vor ein paar Jahren auf Codeproject: http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

Und ich für einen Artikel über IO-Abschlussports gefunden.net (habe es nicht gelesen) http://www.codeproject.com/KB/cs/managediocp.aspx

Ich würde auch sagen, dass es einfach ist, Completion-Ports im Vergleich zu versuchen und eine skalierbare Alternative zu schreiben. Das Problem ist, dass sie nur unter NT (2000, XP, Vista) verfügbar sind.

2

Wenn Sie C++ und das Win32 direkt verwenden, würde ich vorschlagen, dass Sie über überlappende I/O und E/A Completion Ports lesen . Ich habe eine freie C++, IOCP, Client/Server-Framework mit vollständigen Quellcode, siehe here für weitere Details.

Da Sie .Net verwenden, sollten Sie die asynchronen Socket-Methoden verwenden, damit Sie nicht für jede Verbindung einen Thread haben müssen; Es gibt mehrere Links von diesem Blogbeitrag von mir, die nützliche Startpunkte sein können: http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month.html (einige der besten Links sind in den Kommentaren zum ursprünglichen Beitrag!)