2009-05-10 13 views
7

Was ist eine gute Möglichkeit, den Status beim Neustart eines abgestürzten Prozesses beizubehalten?Wie kann ich den Prozessstatus nach einem Absturz wiederherstellen?

Ich habe einen Supervisor in einer OTP-Anwendung, die mehrere "Subsystem" gen_servers beobachtet.

Zum Beispiel ist ein Subsystem "Wetter", das alle 15 Minuten einen neuen Wetterzustand generiert und Abfragen für den aktuellen Wetterzustand abwickelt. (Denken Sie an das Limonadenstand-Spiel)

Wenn dieser gen_server abstürzt, möchte ich, dass er neu gestartet wird, aber er sollte mit dem letzten Wetterzustand neu gestartet werden, nicht irgendein willkürlicher Zustand, der in init() fest codiert ist. Es wäre nicht sinnvoll, wenn der Simulationszustand plötzlich vom "Hagelsturm" zu "angenehm und luftig" würde, nur wegen des Crashs.

Ich zögere, wegen der zusätzlichen Komplexität nach jedem Update den MNS oder MMS zu verwenden, um den Zustand zu speichern; Gibt es einen leichteren Weg?

Antwort

4

Solange es nur zur Laufzeit sein muss, würde die Verwendung von ETS vorschlagen. Der Wert ist weitaus größer als die Komplexität. Die API ist einfach und wenn Sie mit benannten Tabellen arbeiten, ist der Zugriff auch einfach. Sie müssen die Tabelle nur erstellen, bevor Ihr gen_server vom Supervisor gestartet wird.

Zwei - komplexeren - Alternativen:

  • Bauen Sie ein Paar von Prozessen, eine für die Arbeit zu tun, einen für den Zustand Wartung. Aufgrund der Einfachheit des zweiten wäre es wirklich zuverlässig.
  • Ein wirklich alberner könnte der Austausch der Kind-Spezifikation des Supervisors mit dem aktuellen Zustand als Argument jedes Mal sein, wenn sich der Zustand ändert. (Lächeln) Nein, nur Spaß.
2

gibt es einen einfacheren Weg?

wenn Prozess es starb sendet Nachricht an Supervisor, den Zustand des Prozesses enthält, so dass Sie diesen Wert verwenden, können im Supervisor zu speichern (in Mnesia oder Vorgesetzten Zustand) und wenn der Server (in init) es startet müssen den Synchronisierungsaufruf an den Supervisor senden, um den Statuswert zu erhalten. Ich habe kein reales Beispiel, aber ich hoffe es macht Sinn.

Sowieso sehe ich nicht wirklich Problem, Staat in Mnesia zu speichern.

Entschuldigung mein Englisch :)

+1

Der Supervisor sollte so wenig wie möglich Logik enthalten und nur für Neustarts verantwortlich sein. Ein einzelner Fehler in dieser Logik könnte dazu führen, dass ein ganzer Teilbaum abstürzt. –