использование erlang heart

#erlang #heartbeat #erl

#erlang #сердцебиение #erl

Вопрос:

Как следует использовать heart для поддержания работоспособности приложения?

Допустим, у меня есть приложение X, будет ли оно отслеживаться, если я просто вызову что-то вроде:

 erl -boot X -heart -env HEART_BEAT_TIMEOUT 30 -detached
  

?

Ответ №1:

Да, это автоматически запустит процесс heart, который отслеживает ваш узел. Смотрите документацию по сердцу.

Обновление: Да, асимптота верна. Вам также нужна HEART_COMMAND переменная среды, чтобы указать heart, что делать при перезапуске узла.

Ответ №2:

http://www.erlang.org/doc/man/heart.html

 This modules contains the interface to the heart process. heart
sends periodic heartbeats to an external port program, which is
also named `heart`. The purpose of the heart port program is to
check that the Erlang runtime system it is supervising is still
running. If the port program has not received any heartbeats within
`HEART_BEAT_TIMEOUT` seconds (default is 60 seconds), the system
can be rebooted. Also, if the system is equipped with a hardware
watchdog timer and is running Solaris, the watchdog can be used to
supervise the entire system.

<snip>

If the system should be rebooted because of missing heart-beats, or
a terminated Erlang runtime system, the environment variable
HEART_COMMAND has to be set before the system is started. If this
variable is not set, a warning text will be printed but the system
will not reboot.
  

Прямо сейчас у меня есть, Makefile с инструкцией в нем, который будет выполняться erl -heart ... для меня. Когда я выполняю его, вот список процессов:

 ubuntu    3814  3579  3814  3579  0 22:03 pts/0    00:00:00           make webstart
ubuntu    3829  3814  3814  3579 25 22:03 pts/0    00:00:01             /usr/local/lib/erlang/erts-5.8.3/bin/beam.smp -K true -A 5
ubuntu    3848  3829  3848  3848  0 22:03 ?        00:00:00               heart -pid 3829
  

Когда я отключаю PID 3829 , в оболочке Erlang появляется следующий вывод:

 heart: Wed May 18 22:04:09 2011: Erlang has closed.
heart: Wed May 18 22:04:09 2011: Would reboot. Terminating.
make: *** [webstart] Terminated
  

Итак, очевидно, что мне нужно установить HEART_COMMAND в какой-то оператор перезагрузки, и тогда heart будет выполняться по мере необходимости. AFAIK, учитывая описание в документах, heart не предназначен для простого перезапуска виртуальной машины Erlang при сбое; это звучит так, как будто супервайзер Erlang должен делать за вас, но я могу ошибаться.

(Конечно, вы могли бы получить просто HEART_COMMAND для перезапуска вашей программы Erlang).

Комментарии:

1. Да, цель hearts именно в этом (супервизор Erlang — это нечто совершенно другое!). Из документов: The purpose of the heart port program is to check that the Erlang runtime system it is supervising is still running. If the port program has not received any heartbeats within HEART_BEAT_TIMEOUT seconds (default is 60 seconds), the system can be rebooted.