[Erlang] логика рестарта в супервизоре
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.02.09 20:56
Оценка:
Hi,

сейчас стандартный supervisor реализует вот такое:

To prevent a supervisor from getting into an infinite loop of child
process terminations and restarts, a maximum restart frequency is
defined using two integer values MaxR and MaxT. If more than MaxR
restarts occur within MaxT seconds, the supervisor terminates all child
processes and then itself.


это приводит в тяжёлом случае к тому, что дохнет всё приложение, если оно сделано традиционно как "xxx_app:start() запускает xxx_sup".
Хочется же видеть логику стиля юниксового init(8): если рестарт был слишком часто (причём считается по каждому ребёнку отдельно!) — прекращаем стартовать его на некоторое время, но не дохнем.

А ещё лучше — в callback module описать хук с выбором между вариантами в зависимости от чего-то, известного этому модулю.

Кто-нибудь видел такие реализации? Непонятно, по каким словам гуглить.
The God is real, unless declared integer.
Re: [Erlang] логика рестарта в супервизоре
От: Mikl Kurkov Россия  
Дата: 12.02.09 09:36
Оценка: 10 (2)
Здравствуйте, netch80, Вы писали:

N>...

N>это приводит в тяжёлом случае к тому, что дохнет всё приложение, если оно сделано традиционно как "xxx_app:start() запускает xxx_sup".
N>Хочется же видеть логику стиля юниксового init(8): если рестарт был слишком часто (причём считается по каждому ребёнку отдельно!) — прекращаем стартовать его на некоторое время, но не дохнем.

N>А ещё лучше — в callback module описать хук с выбором между вариантами в зависимости от чего-то, известного этому модулю.


N>Кто-нибудь видел такие реализации? Непонятно, по каким словам гуглить.


Можно использовать не один супервизор на приложение, а дерево супервизоров с несколькими уровнями.
Тогда падение одного процесса приводит к падению только его группы со своим супервизором,
который может быть рестартнут супервизором более высокого уровня.
На разных уровнях могут быть отличные стратегии рестарта.

Другой вариант, если нужны более замысловатые стратегии рестарта — реализовать свой супервизор,
пример — Timed supervisor for scheduled process execution

--
Mikl
Re[2]: [Erlang] логика рестарта в супервизоре
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 14.02.09 11:10
Оценка:
Здравствуйте, Mikl Kurkov, Вы писали:

MK>Другой вариант, если нужны более замысловатые стратегии рестарта — реализовать свой супервизор,

MK>пример — Timed supervisor for scheduled process execution

О, на первый взгляд даже подходит без переделки. Спасибо.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.