2016-10-05 5 views
1

Ich verwende TcpListener (Clase) Beispiel https://msdn.microsoft.com/es-es/library/system.net.sockets.tcplistener(v=vs.110).aspx, um TCP-Anfragen zu verarbeiten.So verteilen Sie Anfragen vom TCP-Listener

Aber es scheint wie zur gleichen Zeit diese TCP Listener wird mehrere Anfragen, die später in ein paar Web Services zusammen verarbeitet werden soll akzeptieren und das Ergebnis muss an die TCP client zurückgegeben werden.

Ich denke folgende zu tun:

  1. ein Stream-Objekt zum Lesen und Schreiben von Get NetworkStream stream = client.GetStream(); und in spezieller Container-Klasse speichern.

  2. Setzen Sie diese Klasse auf spezielle Queue Hilfsklasse wie diese C#: Triggering an Event when an object is added to a Queue.

  3. Wenn Queue geändert wird, wurde fire implementiert, um das nächste Warteschlangenelement asynchron mit Task zu verarbeiten.

  4. Innerhalb eines Task mit Web Services, kommunizieren und die Antwort auf TCP Client senden.

Bitte, lassen Sie mich wissen, diese Architektur ist wichtig, und in der Lage, die mehrere Anforderungen an TCP Listener zu lösen.

+2

Und warum in die Warteschlange? Dann werden alle nachfolgenden Anforderungen warten, bis alle vorherigen abgeschlossen sind. – Evk

+0

@Evk Nun ... Ich bin mir nicht sicher über Queue und ich denke, dass ich irgendwie BUFFER brauche, um 'NetworkStream stream = client.GetStream();' schnell zu halten ... Glaubst du, ist genug, um 'Task' zu erstellen und alle Logik dort drüben? –

+1

Nun, es hängt von der Last, denke ich. In einigen Fällen denke ich, dass die Warteschlange eine gute Lösung ist, besonders in Fällen, in denen das, was Sie mit jedem Element tun, CPU-gebunden ist (einige schwere Berechnungen). Aber hier sind Dinge IO gebunden (Sie machen Web-Anfragen), so dass Sie in der Lage sein, viele von ihnen ohne Warteschlange zu behandeln. Also, wenn die Belastung für diesen Service nicht sehr hoch sein wird - ich denke ja, die Verarbeitung von Daten parallel (mit regulären Aufgaben) sollte in Ordnung sein. – Evk

Antwort

1

Verwenden Warteschlange ist definitiv brauchbare Idee, aber überlegen, welchen Zweck es dient. Es begrenzt, wie viele Anfragen Sie parallel bearbeiten können. Möglicherweise müssen Sie das in einigen Fällen einschränken, und am üblichsten ist es, wenn jede Anforderungsverarbeitung eine CPU-gebundene Arbeit ausführt (schwere Berechnungen). Dann ist Ihre Fähigkeit, viele von ihnen parallel zu verarbeiten, begrenzt, und Sie können Warteschlangen verwenden.

In Ihrer Anfrage führt die Verarbeitung eine IO-gebundene Arbeit aus (Warten auf Beendigung der Web-Anfrage). Dies verbraucht nicht viele Serverressourcen und Sie können eine Vielzahl solcher Anfragen parallel verarbeiten, daher ist in Ihrem Fall höchstwahrscheinlich keine Warteschlange erforderlich.

Auch wenn Sie eine Warteschlange verwenden, ist es sehr selten sinnvoll, nur ein Element gleichzeitig zu verarbeiten. Stattdessen Warteschlange mit X Threads verarbeiten (wobei X wiederum davon abhängt, ob die Arbeit CPU oder IO gebunden ist, für die CPU ist es vielleicht in Ordnung mit X = Anzahl der Kerne, mit IO benötigst du mehr). Wenn Sie zu wenige Threads verwenden, um Ihre Warteschlange zu verarbeiten, warten Ihre Clients im Grunde mehr auf nichts und können sogar nach Zeitüberschreitung fehlschlagen.

Verwandte Themen