Batch-dataverarbeitung in Echtzeit

Ich bin mit der Optimierung der performance einer linearen dataverarbeitungsroutine beauftragt. Hier ist ein Überblick über das, was bereits vorhanden ist:

data kommen in UDP-Ports, wir haben mehrere Hörer hören auf verschiedenen Port und schreiben Rohdaten in SQL server-database (können Sie die Tabelle eine RawData). Dann haben wir mehrere Instanzen einer Single-Thread-Linear-Anwendung, die Rohdaten aus der RawData-Tabelle packt und einzelne Datarows verarbeitet. Wenn die Verarbeitungseinrichtung die Rohdaten mit den zuvor empfangenen data für die gegebene Entität verglichen wird, werden Berechnungen durchgeführt, um die Anzahl der verschiedenen Messwerte zu berechnen, dann werden für jede einzelne datazeile mehrere Webdienste aufgerufen und schließlich wird für jede data ein neuer datasatz hinzugefügt Zeile in der ProcessedData-Tabelle. Auch der entsprechende Entitätsdatensatz wird in einer anderen Tabelle aktualisiert.

Wie ich das Problem sehe, kann es in kleinere Teile zerlegt werden und ich könnte Producer / Consumer-Muster für die dataverarbeitung nutzen: Ein Thread des Produzenten füllt eine geteilte (blockierende) Warteschlange, mehrere Konsumenten greifen datazeilen aus der Warteschlange und machen parallel Verarbeitung von ihnen. Nachdem die Konsumenten fertig sind, stellen sie die verarbeiteten data in eine andere freigegebene Warteschlange ein, auf die dann noch ein weiterer User Thread (Single) zugegriffen wird, der eine SqlBulkCopy ausführt, um neue datasätze einzufügen. Entlang des processes wird es eine andere gemeinsame Warteschlange, die Entity-Info für Updates speichern wird und noch ein anderer Verbraucher wird greifen aktualisierte Informationen für die Entitäten und die Durchführung von Updates.

Frage ist, obwohl es geradeaus scheint, sieht es mir an, ein umständlicher Ansatz zu sein. Ich glaube, es gibt einen besseren path zu tun, was ich suche. Irgendwelche Vorschläge zur Umsetzung des oben genannten Produzenten / Konsumentenmusters? Oder sollte ich nach einem anderen Designmuster für mein Problem suchen?

Danke im Voraus

Ihre vorgeschlagene Lösung klingt vernünftig, und ich sehe es nicht als umständlich an. Es ist einfach zu verstehen, einfach zu implementieren, effektiv und effizient. Es erlaubt Ihnen auch, die Anzahl der Produzenten und Verbraucher zu stimmen, um die beste performance zu erzielen. Zersetzung in kleinere Teile mit begrenzter Kommunikation zwischen den Teilen ist eine sehr gute Sache.

Also, was Sie haben, ist mehrere Threads (Produzenten), die data von UDP lesen und diese Elemente in einer gemeinsamen Warteschlange speichern. Nennen Sie es die RawData Warteschlange. Mehrere Verbraucher lesen aus dieser Warteschlange, verarbeiten Elemente und legen die Ergebnisse in eine andere freigegebene Warteschlange. Nennen Sie es die ProcessedData Warteschlange. Schließlich haben Sie einen einzigen Thread, der die ProcessedData Warteschlange liest und Elemente in der database speichert.

Die .NET BlockingCollection ist dafür perfekt.

Dies könnte eine Hilfe sein: Frage zum C # Threading mit RFID