reiniciar automáticamente las aplicaciones Erlang
-
27-09-2019 - |
Pregunta
Hace poco se encontró con un error en el que murió toda una aplicación de Erlang, dando un mensaje de registro que se parecía a esto:
=INFO REPORT==== 11-Jun-2010::11:07:25 ===
application: myapp
exited: shutdown
type: temporary
No tengo idea de lo que dio origen a este apagado, pero el verdadero problema que tengo es que no se reiniciará. En cambio, el ahora vacío Erlang VM allí sentado sin hacer nada.
Ahora, desde la investigación que he hecho, parece que hay otros "tipos iniciar" se puede dar una aplicación:. 'Transitoria' y 'permanente'
Si comienzo a un Supervisor en una aplicación, te puedo decir que para hacer un proceso particular transitoria o permanente, y se reiniciará automáticamente para mí. Sin embargo, de acuerdo con la documentación, si hago un aplicación transitoria o permanente, no se reinicia cuando se muere, sino que mata todos los demás aplicaciones, así .
Lo que realmente quiero hacer es de alguna manera decirle al Erlang VM que una aplicación particular debe estar siempre en funcionamiento, y si se cae, vuelva a iniciarlo. ¿Es esto posible hacer?
(no estoy hablando de la implementación de un supervisor en la parte superior de mi solicitud, porque entonces es una captura 22:? ¿Y si mis bloquea el proceso del supervisor que estoy buscando algún tipo de API o el ajuste que puedo usar para tener monitor de Erlang y reiniciar mi solicitud para mí.)
Gracias!
Solución
debe ser capaz de solucionar este problema en el supervisor de nivel superior: establecer la estrategia de reinicio para permitir que un millón se reinicia cada segundo, y la aplicación nunca debe bloquearse. Algo así como:
init(_Args) -> {ok, {{one_for_one, 1000000, 1}, [{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}]}}.
(Ejemplo adaptado del OTP Principios de diseño Guía del usuario .)
Otros consejos
Se puede usar corazón para reiniciar toda la máquina virtual si se cae, entonces el uso un tipo de aplicación permanente para asegurarse de que las salidas de VM cuando su aplicación se cierra.
En última instancia se necesita algo por encima de la aplicación que necesita confianza, si se trata de un proceso supervisor, el Erlang VM, o algún script que escribió -. Siempre será un problema si eso sucede a fallar también
Uso Monit, configuración, entonces su aplicación terminar mediante el uso de un supervisor para toda la aplicación con una frecuencia razonable reinicio. Si los terminada su aplicación, la expiración de la máquina virtual, y se reinicia monit todo.
Nunca pude corazón sea lo suficientemente fiable, ya que sólo se reinicia la máquina virtual una vez, y no trata bien con un kill -9 de la Erlang VM.