erlang - ¿Cómo puede un supervisor que alcanzó_max_restart_intensity eliminar al niño infractor?
otp (1)
Creo que la mejor solución sería tener dos capas de supervisión.
Un supervisor que inicia un supervisor + un par de procesos para cada gen_server
que desea ejecutar. Este supervisor está configurado con one_for_one
estrategia one_for_one
y one_for_one
temporary
.
Cada supervisor que se ejecuta bajo este supervisor habría configurado correctamente los valores MaxR
y MaxT
, que provocarán un colapso de ese supervisor una vez que el niño se comporte mal.
Cuando el supervisor de nivel inferior falla, el supervisor de nivel superior "simplemente no le importa".
Un supervisor consume 233 bytes cuando se inicia con un elemento secundario (tamaño de almacenamiento dinámico total), por lo que el consumo de memoria no debería ser un problema.
El árbol de supervisión debería verse así:
supervisor_top
|
|
+------------------------+----- ...
| |
supervisor_1 supervisor_2
restart temporary restart temporary
| |
gen_server_1 gen_server_2
restart transient restart transient
Tengo un supervisor one_for_one
que maneja niños similares y totalmente independientes.
Cuando hay un problema con un niño, se bloquea y se desencadena repetidamente:
=SUPERVISOR REPORT==== 30-Mar-2011::13:10:42 ===
Supervisor: {local,gateway_sup}
Context: shutdown
Reason: reached_max_restart_intensity
Offender: [{pid,<0.76.0>}, ...
cerrándose y también terminando a todos los niños inocentes que de lo contrario seguirían funcionando bien.
¿Cómo puedo construir un árbol de supervisión a partir de los supervisores estándar de Erlang que solo se detiene para reiniciar al niño infractor y deja a los demás en paz?
Estaba pensando en tener un supervisor adicional con un solo hijo, pero esto parece ser un peso pesado para mí.
¿Alguna otra forma de manejar esto?