Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Resynchronisierung einer verteilten Working Queue
dannyyy - Fr 27.03.09 08:37
Titel: Resynchronisierung einer verteilten Working Queue
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
alzaimar - Fr 27.03.09 10: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?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!