erlang otp supervisor

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?