2009-05-10 26 views
7

¿Cuál es una buena forma de mantener el estado al reiniciar un proceso bloqueado?¿Cómo puedo restaurar el estado del proceso después de un bloqueo?

Tengo un supervisor en una aplicación OTP que mira varios gen_servers "subsistema".

Por ejemplo, uno es un subsistema "clima" que genera un nuevo estado del tiempo cada 15 minutos y maneja las consultas para el estado del tiempo actual. (Piensa en el juego de la limonada)

Si gen_server falla, quiero que se reinicie, pero debe reiniciarse con el estado meteorológico más reciente, no con un estado arbitrario codificado en init(). No tendría sentido que el estado de simulación pase repentinamente de "tormenta de granizo" a "agradable y ventoso" solo por el accidente.

Dudo en usar mnesia o ETS para almacenar el estado después de cada actualización debido a la complejidad añadida; ¿hay una manera mas facil?

Respuesta

4

Mientras solo tenga que estar durante el tiempo de ejecución, sugeriría el uso de ETS. El valor es mucho mayor que la complejidad. La API es simple y si estás trabajando con tablas nombradas, el acceso también es simple. Solo tiene que crear la tabla antes de que su gen_server sea iniciado por el supervisor.

Dos - más complejas alternativas: -

  • construir un par de procesos, uno para el trabajo a hacer, uno para el mantenimiento del estado. Debido a la simplicidad del segundo, sería realmente confiable.
  • Una verdadera tontería podría ser el intercambio de las especificaciones hijo del supervisor con el estado actual como argumento cada vez que el estado está cambiando. (sonrisa) No, es broma.
2

¿hay alguna manera más fácil?

cuando el proceso de morir se envía un mensaje a un supervisor que contiene Estado del proceso, por lo que puede utilizar este valor para almacenar en el supervisor (en mnesia o estado del supervisor) y cuando el servidor comenzará (en init) se tiene que enviar una llamada de sincronización al supervisor para obtener el valor del estado. No tengo un ejemplo real, pero espero que tenga sentido.

De todos modos, realmente no veo problema para almacenar el estado en mnesia.

sorry my English :)

+1

El supervisor debe contener la menor lógica posible y ser responsable de los reinicios solamente. Un solo error en esa lógica podría llevar a un subárbol completo a bloquearse. –

Cuestiones relacionadas