Laden...

Umsetzung paralleler Aufgabenverarbeitung mit unterschiedlichen Intervallen

Erstellt von telnet vor 8 Jahren Letzter Beitrag vor 8 Jahren 968 Views
T
telnet Themenstarter:in
327 Beiträge seit 2006
vor 8 Jahren
Umsetzung paralleler Aufgabenverarbeitung mit unterschiedlichen Intervallen

Hallo zusammen,

ich habe hier folgende Problemstellung:
Ein Hintergrunddienst soll sich aus einer (angenommen beliebigen) Datenquelle Stammdaten holen, die zur weiteren Datenverarbeitung benötigt werden.
Die Sätze dieser Stammdaten haben eine Eigenschaft, die sie in unterschiedliche Kategorien einteilt, die die weitere zeitliche Verarbeitung regeln. Außerdem sollen die Stammdaten in einem definierten Intervall neu eingelesen werden, damit Änderungen automatisch übernommen und berücksichtigt werden.
Grob gesagt gibt es Datensätze, die alle 1, 2, 5 oder 10 Minuten verarbeitet werden sollen.

Ich wäre jetzt folgendermaßen vorgegangen:

  1. Zyklisch die Stammdaten in eine simple List<> einlesen
  2. So viele Timer erstellen, wie ich verschiedene Intervalle habe.
  3. Synchronisation der Stammdaten-List<> über ein Objekt, das ich per lock() während der Aktualisierung der Stammdaten sperre
  4. Beim Ablauf eines Verarbeitungstimers ziehe ich mit aus der Liste der Stammdatenobjekte eine Kopie, die nur die für den aktuellen Timer relevanten Elemente enthält.
  5. Die Timer sichere ich intern gegen "sich selbst überholen" ab.

Jetzt gibt es inzwischen aber ja schon neuere Möglichkeiten wie Tasks, Pipelines etc. mit denen ich aber noch nicht konkret gearbeitet habe.

Hat jemand evtl. eine Empfehlung für mich, wie ich so eine Aufgabe möglichst "sauber" realisieren könnte?
Hab mir auch schon Sachen wie Quartz.Net angesehen aber ich denke, dass das für meine Zwecke evtl. oversized ist...

16.806 Beiträge seit 2008
vor 8 Jahren

Hört sich nach einem Lehrbuch-Fall von einer Mischung von http://www.quartz-scheduler.net/ (für das Scheduling) und TPL Pipelines für die Schrittweise-Abarbeitung an

T
telnet Themenstarter:in
327 Beiträge seit 2006
vor 8 Jahren

Hallo Abt,

erst mal vielen Dank für die schnelle Antwort!

Dann war ich ja schon mal gar nicht so falsch dran.. Quartz.Net schaue ich mir dann mal genauer an.. die Pipelines habe ich mir auch schon angesehen, allerdings hätte ich nicht mehrere hintereinandergeschaltete Pipelines...

Ich habe ja keine mehrstufige Verarbeitung sondern nur einmal das Laden der Stammdaten, die dann nicht weiter verarbeitet werden, und das Laden der Bewegungsdaten in verschiedenen Intervallen, die dann wirklich verarbeitet werden.
Da die geladenen Bewegungsdaten dann aber auf die gleiche Art und Weise verarbeitet werden bräuchte ich nur eine BlockingCollection, in die alle Bewegungsdaten geschrieben werden und aus der Sie dann zur Verarbeitung "entnommen" würden.
Hab ich das so richtig verstanden?

16.806 Beiträge seit 2008
vor 8 Jahren

Das Laden ist ein Schritt (zB typeof(Action<T>)), das Verarbeiten ist ein Schritt.. etc etc...
Das kann man beliebig skalieren..