Frage

Meine C # Klasse muss in der Lage sein, ein hohes Volumen an Veranstaltungen über eine TCP-Stream-Stil-Socket-Verbindung empfangen zu verarbeiten. Das Volumen der Ereignismeldungen vom TCP-Server durch die Klasse des Socket empfangen ist völlig variabel. Zum Beispiel, manchmal wird es nur eine Ereignismeldung in einem Zeitraum von 10 Sekunden erhalten und zu anderen Zeiten wird es eine sechzig Ereignismeldungen innerhalb einer Sekunde erhalten.

Ich bin mit Socket.ReceiveAsync Nachrichten zu empfangen. ReceiveAsync gibt true zurück, wenn die Empfangsoperation anhängig ist oder falsch, wenn bereits Daten auf dem Draht und den Betrieb synchron abgeschlossen erhalten. Wenn die Operation ansteht, wird der Sockel meinen Rückruf bei einem IO-Abschlussthread nennen, sonst rufe ich meinen eigenen Rückruf in den aktuellen (IOC) Gewinden. Darüber hinaus mit Ereignismeldungen gemischt ich auch Antworten auf Befehle empfängt, die an diesen TCP-Server gesendet wurden. Antwortnachrichten werden sofort verarbeitet werden; einzeln, durch einen Thread Arbeiter abzufeuern.

Allerdings würde Ich mag Ereignismeldungen in der Warteschlange, bis ich „genug“ (N) von ihnen habe oder bis es nicht mehr auf dem Draht ist ... und dann einen Thread Arbeiter feuere eine Charge von Ereignismeldungen zu verarbeiten. Außerdem möchte ich alle Ereignisse sequentiell verarbeitet werden, so dass ich nur ein Thread Arbeiter zu einem Zeitpunkt, zu arbeiten auf diese will.

Der Prozessor von Ereignismeldungen müssen nur die Nachrichtenpuffer in ein Objekt kopieren, ein Ereignis auslösen und dann die Nachrichtenpuffer zurück in den Ring-Puffer-Pool. Also meine Frage ist ... was denken Sie, die beste Strategie ist, um dies zu erreichen?

Haben Sie benötigen weitere Informationen? Gib mir Bescheid. Dank !!

War es hilfreich?

Lösung

Ich würde nicht nennen 60 Ereignisse pro Sekunde hoher Lautstärke. Bei diesem niedrigen Aktivitätsniveau jeder Buchse Verarbeitungsverfahren überhaupt mit in Ordnung sein. Ich habe 5000 Ereignisse pro Sekunde auf einem einzigen Thread behandelt Hardware verwenden, die als aktuelle Maschinen viel weniger in der Lage ist, nur mit select.

Ich werde sagen, dass, wenn Sie zu skalieren suchen, Nachrichten eines Handoffs einzeln zwischen den Threads wird eine Katastrophe sein. Sie müssen Batch oder Ihre Kontextwechsel wird die Leistung töten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top