Sollte ein Kunde Abwicklungsprozess an den Supervisor Baum hinzugefügt werden?

StackOverflow https://stackoverflow.com/questions/152744

  •  02-07-2019
  •  | 
  •  

Frage

in Erlang habe ich einen Supervisor-Baum von Prozessen, eine, die die TCP / IP-Verbindungen akzeptiert. Für jede eingehende Verbindung laichen ich einen neuen Prozess. Sollte dieser Prozess an den Supervisor Baum oder nicht hinzugefügt werden?

Viele Grüße,  Steve

War es hilfreich?

Lösung

Ja, Sie sollten diese Prozesse auf die Überwachung Hierarchie hinzufügen, wie Sie wollen, korrekt sein / ordnungsgemäß herunterzufahren, wenn die Anwendung beendet wird. (Sonst Sie am Ende undichte Verbindungen, die als Anwendungsinfrastruktur hängen sie bisher gemacht Shutdown fehl).

Sie könnten eine simple_one_for_one Strategie Supervisor erstellen sagen yourapp_client_sup, die ein Kind spec von {Id, {yourapp_client_connection, start_link_with_socket, []}, Restart, Shutdown, worker, temporary} hat. Der temporary Typ hier ist wichtig, weil es normalerweise nicht sinnvoll Neustart Strategie für einen Verbindungs-Handler - Sie können nicht an den Client eine Verbindung herstellen, um die Verbindung neu zu starten. temporary hier die Supervisor bewirken, dass der Verbindungs-Handler Ausgang berichten, aber ansonsten ignorieren.

Der Prozess, der gen_tcp:accept tut, wird dann die Verbindungshandhabungsprozess erstellen, indem supervisor:start_child(yourapp_client_sup, [Socket,Options,...]) tun, anstatt yourapp_client_sup:start_link(Socket, Options, ...). Stellen Sie sicher, dass die youreapp_client_connection:start_link_with_socket Funktion das Kind über gen_server oder proc_lib Funktionen startet (eine Anforderung des supervisor-Modul) und dass die Funktion überträgt die Steuerung der Steckdose, um das Kind mit gen_tcp:controlling_process sonst wird das Kind nicht in der Lage die Steckdose zu verwenden.

Ein alternativer Ansatz ist es, einen Dummy yourapp_client_sup Prozess zu schaffen, die Prozesse yourclient_connection_handler auf beim Start verknüpfen. Der yourapp_client_sup Prozess existiert nur EXIT Nachrichten von ihren Eltern auf die Verbindungshandhabungsprozesse zu propagieren. Es muss abzufangen existiert und ignorieren alle EXIT Nachrichten andere als die von der übergeordneten. Im Großen und Ganzen, ziehe ich den simple_one_for_one Supervisor Ansatz zu verwenden.

Andere Tipps

Wenn Sie diese Prozesse erwarten, dass viele sein, könnte es eine gute Idee, einen Supervisor unter Ihrem Haupt Supervisor hinzuzufügen als Verantwortung zu trennen (und vielleicht die simple_one_for_one Einstellung verwenden, um die Dinge einfacher, vielleicht sogar einfacher als die aktuelle Fall) .

Die Sache ist, wenn Sie diese Prozesse steuern müssen, es ist immer schön, einen Supervisor zu haben. Wenn es spielt keine Rolle, wenn sie Erfolg haben oder nicht, dann könnten Sie nicht brauchen. Aber dann wieder, ich argumentieren immer, das ist schlampig Codierung. ; -)

Das einzige, was ich würde nicht zu tun, ist, sie zu Ihren vorhandenen Baum hinzuzufügen, es sei denn, es ist sehr offensichtlich, woher sie kommen und sie sind recht wenige.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top