Announcement

Collapse
No announcement yet.

Resynchronisierung einer verteilen Working Queue

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Resynchronisierung einer verteilen 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

  • #2
    Ich liebe diese Mehrfach-Posts, siehe mycsharp und c-sharp-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

    Comment


    • #3
      also ich würde in einer Tabelle in dem DataStore speichern dass eine Instanz (muss einfach einen eindeutigen Namen erhalten, sprich dem Datastore müssen alle möglichen Instanzen bekannt sein und er vergibt dafür IDs welche sich nie ändern), welchen Datensatz sie gerade bearbeitet nach dem Motto ID Instanz - ID Datensatz. Nach einem Absturz muss sich die INstanz neu melden und sagt beim erstmaligen verbinden ich habe diese DAtensätze nicht bearbeitet bla bli blub und schon sind sie wieder frei oder werden neu bearbeitet. Ich weiß jedoch nicht ob dir das genügt oder ob du möchtest dass die anderen Instanzen merken hoppla fehler ich könnte diese jetzt bearbeiten
      Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

      Comment

      Working...
      X