Autor Beitrag
dannyyy
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Fr 27.03.09 09:37 
Guten Tag,

Ich bin auf der suche nach einem Algorithmus / Pattern um folgendes Problem zu lösen:

- Es gibt einen zentralen Datastore, der Datensätze enthält die einen Status von 0-2 haben.
0 = Nicht erledigt
1 = In bearbeitung
2 = Erledigt

- Eine oder mehrere Instanzen eines Verarbeitungsprogrammes, welche auf den selben Datenstore zugreifen.
Die Instanzen kennen sich untereinander nicht! Weder Anzahl noch direkte Kommunikationsmöglichkeit.

Nun gibt es folgenden funktionierenden Ablauf:
- Jede Instanz holt sich vom Datenstore eine Menge von Datensätzen die den Status 0 haben und setzt diesen auf 1 (atomar).
- Verarbeitet die Datensätze und setzt bei jedem verarbeiteten den Status 2.
- Die Datensätze werden in einer PriorityQueue in der Instanz verwaltet.


Das Problem was nun gelöst werden muss ist folgendes: Wie kann bei einer abgestürzten Queue detektiert werden, welche Datensätze noch in der Queue waren mit dem Status 1
und somit noch nicht abgearbeitet wurden.

Zwei mögliche Ansätze die dabei in Frage kommen sind:
- Alle vorhandenen Instanzen leeren ihre Queues und bauen Sie neu auf in dem Status mit 0 und 1 berücksichtigt werden
(Setzt voraus, dass alle Instanzen vom Absturtz der Queue erfahren haben und garantiert ihre Queues leeren)
- Es werden nur jene mit Status 1 neu zugeteilt, die vorhin von einer abgestürzten Queue nicht mehr verarbeitet wurden
(Setzt voraus, dass zu jedem Datensatz bekannt ist, wer diese in seiner Queue hat)

Wie kann dies bewerkstelligt werden, ohne dass bekannt ist wieviele Instanzen zur Zeit laufen und diese Untereinander kommunizieren könnten.
Einzige Kommunikation die möglich ist, ist eine Tabelle in der gemeinsamen Datenbank (Datastore) zu benutzen um eine resync. anzuzeigen.

Besten Dank für jeden lösungsbringenden Vorschlag
Freundliche Grüsse
Danny Meier
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 27.03.09 10:23 
Ich liebe diese Mehrfach-Posts, siehe mycsharp und entwickler-forum

Bevor die Nachfrage kommt, was gegen Mehrfach-Posts spricht: Ich habe so oft wiederholt, dass parallel Antworten gegegen werden und es zumindest unhöflich ist, viele Helfer einzuspannen, ohne dass denen die Diskussionen bekannt sind.

Jürgen
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 27.03.09 11:02 
mysharp.de hat den Thread schon geschlossen.

Meine Antwort dazu wäre jedoch, zu vermeiden, das die Queue 'abstürzt'. Das klingt nach 'ich bin nicht schuld'. Eine Queue ist eine Datenstruktur und kann nicht abstürzen, außer, man lässt sie fallen. Der Code drumherum ist das Problem bzw. der, der ihn fabriziert hat.

Implementiere einfach eine stabile Queue. Wenn der PC selbst abstürzen kann (Stromausfall o.ä) besorge Dir entweder eine Datenbank und implementiere eine DB-gestützte Lösung oder eine USV und speichere im Havariefall die (an sich stabile) Queue einfach ab.

Edit: Oh, ich sehe gerade, jede Instanz verwaltet seine eigene Queue :gruebel: Wer sich das wohl ausgedacht hat?

_________________
Na denn, dann. Bis dann, denn.