Ich stehe vor einer Aufgabe, die ich ohne den gut durchdachten Multi-Threading werde wahrscheinlich nicht lösen können.
Folgender Aufgabe: Über zwei WebSocket-Verbindungen bekomme ich extrem viele Datenpakete (bis zu 500 pro Sekunde, bis zu 4 KB groß). Bei den Datenpaketen handelt es sich um die Sensorendaten, die möglichst schnell verarbeitet und visualisiert werden müssen. Mit „möglichst schnell“ ist gemeint, dass jede vermeidbare Verzögerung vermieden und dadurch die max. mögliche Performance erreicht werden soll. Andererseits soll das Ganze stabil bleiben und das System nicht extrem überlasten.
Jedes empfangene Datenpaket muss folgende Schritte durchlaufen:
1. Entschlüsseln
2. Die entschlüsselten
XML- oder JSON-Daten in einen Objekt (oder Record) umwandeln.
3. Eine n Zahl der vordefinierten Filter durchlaufen, wodurch das Objekt durch zusätzliche Daten ergänzt wird. Hier finden nun auch Zugriffe (u.a. schreibende) auf die Variablen der Filter-Objekte statt, die potenziell aus mehreren parallel laufenden Threads erfolgen können. Diese Zugriffe müssen mit möglichst geringen Performanceeinbüßen geschützt werden.
4. Hinzufügen des neuen Objekts einem thread-sicheren Container, der als Custom Data Source für die DevExpress Quantum Grid dient. Was das am besten für ein Container sein soll, ist auch eine Frage.
5. Visualisieren des Objektes in einem Grid.
6. Darstellung der Objektdaten in einem Chart.
7. Eventuell Ausgabe eines akustischen Signals.
Die Datenpakete seriell zu verarbeiten kommt bei der Menge der Daten nicht infrage. Jedes Datenpaket unkontrolliert einem neuen Thread zuzuweisen und hoffen, dass alles glatt läuft, auch. Es muss also ein cleverer Thread-Manager her, der für den schnellen und stabilen Ablauf bei möglichst vielen parallel laufenden Tasks sorgt. Ich habe an Parallel Programming Library oder OmniThreadLibrary gedacht.
Ich lese gerade viel über OmniThreadLibrary und je mehr ich lese, desto stärker neige ich dazu, das Ganze mit der Library zu realisieren. Es scheint einfach so, dass die Bibliothek für jede erdenkliche Situation eine passende fertige Lösung hat und dabei auf Performance ausgelegt ist.
Wie würdet Ihr das Ganze realisieren? Für möglichst detaillierte Gedankenäußerungen und kleine Code-Bespiele für das bessere Verständnis bedanke ich mich im Voraus!