наблюдение за процессом перезапуска ребенка - PullRequest
0 голосов
/ 25 октября 2011

У меня есть такая структура

-------------
|Supervisor |
-------------
      |
-------------
|  Child1   |
-------------
      |
-------------
|  Child2   |
-------------

В этой структуре, child1 контролируется и порождает child2.Что мне нужно, чтобы иметь возможность перезапустить child1 при сбое / выходе child2.Какой будет лучший способ достичь этого?

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Если вы позволите Child1 аварийно завершить работу при Child2, ваш существующий руководитель просто перезапустит Child1, таким образом, также перезапустит Child2.

Но это зависит от сбоя Child1 при сбое Child2. Другой вариант это вставить другого супервизора в дерево процессов:

Change this:                          Into this:

+------------+                      +------------+
| Supervisor |                      | Supervisor |
+------------+                      +------------+
      |                                   |
+------------+                      +------------+
|   Child1   |  New supervisor ---> | Supervisor |
+------------+                      +------------+
      |                               |      |
+------------+              +------------+ +---------+
|   Child2   |              |   Child1   | |  Child2 |
+------------+              +------------+ +---------+
      |                                        |
 other service                            other service

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

0 голосов
/ 25 октября 2011

Ознакомьтесь с документацией Erlang: http://www.erlang.org/doc/design_principles/sup_princ.html

Все, что вам нужно сделать, это перестроить дерево процессов и использовать one_for_all стратегию перезапуска. По моему мнению, Child1 и Child2 должны быть детьми Supervisor.

Или, если вы хотите сохранить вещи такими, какие они есть в данный момент, вы должны поймать EXIT процесса Child2 в процессе Child1. Когда EXIT доходит до Child1, все, что должен вернуть Child1:

{stop, normal, State}

и он будет автоматически перезапущен супервизором. Supervisor должен находиться в режиме permanent перезапуска.

...