Автоматически перезапускающие приложения Erlang

Я недавно столкнулся с ошибкой, где все приложение Erlang умерло, приведя к сообщению журнала, которое было похоже на это:

=INFO REPORT==== 11-Jun-2010::11:07:25 ===
     application: myapp
     exited: shutdown
     type: temporary

Я понятия не имею, что инициировало это завершение работы, но настоящая проблема, которую я имею, состоит в том, что оно не перезапускало себя. Вместо этого теперь пустой Erlang VM просто расположился, там ничего не делая.

Теперь, от исследования я сделал, похоже, что существует другой, "запускают типы", можно дать приложение: 'переходный' и 'постоянный'.

Если я запускаю Супервизор в рамках приложения, я могу сказать этому делать конкретный процесс переходным или постоянным, и это автоматически перезапустит его для меня. Однако согласно документации, если я подаю заявку, переходную или постоянную, она не перезапускает его, когда она умирает, а скорее она уничтожает все другие приложения также.

То, что я действительно хочу сделать, так или иначе говорят Erlang VM, что конкретное приложение должно всегда работать, и если это понижается, перезапустите его. Действительно ли это возможно сделать?

(Я не говорю о реализации супервизора сверху моего приложения, потому что затем это - выгода 22: что, если мой процесс супервизора отказывает? Я ищу своего рода API или устанавливаю это, я могу использовать, чтобы сделать, чтобы Erlang контролировал и перезапустил мое приложение для меня.)

Спасибо!

5
задан Nick 16 June 2010 в 15:18
поделиться

3 ответа

Вы должны быть в состоянии исправить это в супервизоре верхнего уровня: установите стратегию перезапуска, чтобы разрешить миллион перезапусков каждую секунду, и приложение никогда не должно падать. Что-то вроде:

init(_Args) ->
    {ok, {{one_for_one, 1000000, 1},
          [{ch3, {ch3, start_link, []},
            permanent, brutal_kill, worker, [ch3]}]}}.

(Пример адаптирован из OTP Design Principles User Guide)

.
4
ответ дан 18 December 2019 в 14:42
поделиться

Используйте Monit, затем настройте приложение на завершение работы с помощью супервизора для всего приложения с разумной частотой перезапуска. Если приложение завершается, виртуальная машина завершает работу, и monit все перезапускает.

Мне никогда не удавалось заставить Heart быть достаточно надежным, поскольку он перезапускает виртуальную машину только один раз и не справляется с kill -9 виртуальной машины erlang.

4
ответ дан 18 December 2019 в 14:42
поделиться

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

В конечном итоге вам нужно что-то над вашим приложением, чему вы должны доверять, будь то процесс супервизора, виртуальная машина erlang или написанный вами сценарий оболочки - всегда будет проблемой, если он тоже выйдет из строя.

5
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: