Erlang-Prozess neu starten und Status beibehalten

8

Ich habe einen Supervisor-Prozess, der die Anzahl der untergeordneten Prozesse startet. Momentan, wenn das Kind stirbt, spawne ich einen neuen Prozess mit neuem Pid. Das bedeutet, dass ich die Statusinformationen meines gerade gestorbenen Kindprozesses verliere. Ich möchte, dass meine Clients mit untergeordneten Prozessen kommunizieren, wobei immer die gleiche Kennung verwendet wird. Trotz der Tatsache, dass der Kindprozess möglicherweise vom Supervisor abbricht und neu gestartet wird.

Ich dachte daran, Kindprozesse mit eindeutigen Namen zu registrieren und den Kindstatus in der ETS-Tabelle zu speichern. Die Frage ist - was ist der empfohlene Weg, um sich einem solchen Problem in Erlang zu nähern?

Danke!

    
Mark 02.11.2012, 16:41
quelle

3 Antworten

8

Das Speichern des Prozessstatus in einer ETS-Tabelle würde dazu beitragen, dass Ihr Zustand zwischen Abstürzen bleibt, und ich verwende normalerweise die globale Registrierung, um Prozessen persistente Namen zu geben. (Der Player 200 wird als {player, 200} registriert.) Ich empfehle die Verwendung der lokalen Registrierung nicht, da Sie Atome verwenden müssen. Wenn Sie viele untergeordnete Prozesse haben, können Sie Ihr Atom-Limit schnell auffrischen dynamisch erstellen (wie player_200, player_201, etc.)

Das Speichern von Kindstatus in der ETS-Tabelle hat jedoch eigene Risiken und Probleme. Wenn ein Kind zwischen dem Moment, in dem ein Fehler auftritt, und dem Speichern in der ETS-Tabelle abstürzt, sollten Sie in Ordnung sein. Was passiert jedoch, wenn Sie Daten verarbeiten, die dazu führen, dass das Kind den Müllzustand speichert, und dann bei der Verarbeitung der nächsten Nachricht abstürzt? Sie starten den Prozess neu, laden den fehlerhaften Zustand aus der Tabelle ets und stürzen die nächste Nachricht erneut ab. Es gibt sicherlich Möglichkeiten, damit umzugehen, aber Sie sollten sich bewusst sein, dass es eine Möglichkeit ist und umgehen.

Während Erlang die Probleme bei der Verteilung einer ETS-Tabelle an alle Prozesse verbirgt, geschieht dies auf Kosten der CPU und potenzieller Konflikte. Wenn Sie viele Änderungen an Ihrem ETS-Tisch vornehmen, werden Sie dafür in der Leistung bezahlen.

Wenn Ihre Kinder zusammenbrechen, sollten Sie nicht nach einem Weg suchen, wie sie die fehlerhaften Bedingungen beseitigen können? Ich würde normalerweise einen Prozessabsturz als etwas machen, das ich zur Ursache und zur Reparatur brauchte. ?

    
Sniggerfardimungus 02.11.2012, 18:36
quelle
5

Die Verwendung von ETS-Tabellen ist wahrscheinlich der Weg, um den Zustand zu erhalten. In Vinoskis Artikel wird erläutert, wie es möglich ist, einen Neustart durchzuführen abgestürzter Prozess unter Beibehaltung der ETS-Tabellendaten.

Da @ user30997 darauf hinweist, dass die Daten in der Tabelle möglicherweise der Grund dafür sind, dass der Prozess abgestürzt ist, sollten Sie beim Neustart die Tabelle validieren (oder ein Limit festlegen, wie oft der Prozess neu gestartet wird ...)

Wenn Sie Prozesse mit IDs verknüpfen möchten, sollten Sie sich gproc ansehen, was für diesen Zweck sehr gut ist.

    
johlo 03.11.2012 10:53
quelle
0

Verwenden Sie Ereignisspeicherung, halten Sie alle Ereignisse fest und wiederholen Sie die Wiedergabe, um den Status wiederherzustellen. Falls Sie schnelle Wiederholungen benötigen, machen Sie einen Schnappschuss. Das Beispiel unten: Ссылка

Es wäre sogar schön, auf der Grundlage dieses Beispiels ein vollständiges Framework zu erstellen.

    
Henry H. 31.01.2016 16:04
quelle

Tags und Links