Будет ли прерывание сети вызывать monitor_node или разрыв связи в Erlang / Elixir? - PullRequest
0 голосов
/ 19 ноября 2018

В ситуации распространения, например, 3 узла, работающие на разных машинах, они подключаются по умолчанию как клики в Erlang / Elixir.Мы называем их A, B и C (они связаны явно путем вызова сети: connect).Предположим, что происходит прерывание сети между A и B.

1) Будет ли прерывание между A и B инициировать разрыв связи (spawn_link) между процессами на A и B, так как у нас все еще есть C в качестве промежуточного связанного узла.А как насчет monitor_node (это будет срабатывать на A или B)?

2) Можем ли мы по-прежнему отправлять сообщения от процесса A к процессу B, поскольку C работает как промежуточный связанный узел?

3) Как компоненты членства Erlang / Elixir решают эту ситуацию?Будет ли восстановлено соединение, и в конце концов ничего плохого не произойдет (никакая связь не разорвана, сообщение monitor_node не возвращается, как будто все сразу восстанавливается)?

Спасибо за внимание к этому вопросу!

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

1) Прерывание между A и B вызовет разрыв связи (spawn_link) между процессами на A и B, так как у нас все еще есть C в качестве промежуточного связанного узла.А как насчет monitor_node (это будет срабатывать на A или B)?

Поведение узлов Erlang по умолчанию заключается в подключении транзитивно , что означает, что при таких функциях, как connect или ping вызываются из узла A в B, если соединение установлено, A также попытается соединиться со всеми узлами, известными B, то есть со списком, полученным при вызове nodes() в узле B.

2) Можем ли мы по-прежнему отправлять сообщения из процесса A в процесс B, поскольку C работает как промежуточный связанный узел?

Это зависит от того, может ли A напрямую подключиться к B с помощью переходного поведения, которое у меня есть.упомянутое выше, тогда это не имеет никакого значения.См. Ниже:

A ----- C ----- B

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

A ----- C
\     /
 \   /
   B

Таким образом, даже когда узел C работает, A не пройдет через него, чтобы достичь B. Но если прохождение C является единственным физическим способом для A достичь B, тогда A и B не будутспособен больше общаться.

3) Как компоненты членства в Erlang / Elixir решают эту ситуацию?Будет ли восстановлено соединение, и в конце концов ничего плохого не произойдет (никакая связь не разорвана, не будет возвращено сообщение monitor_node, как будто все сразу восстанавливается)?

Если отслеживаемый узел выходит из строя, появится сообщениеформы {nodedown, Node}, отправляемой процессу мониторинга, чтобы он мог обработать ошибку.Соединение не будет восстановлено, пока сам узел не восстановится.Если отказавший узел, например, не играет критической роли в сети, и другие узлы могут по-прежнему взаимодействовать друг с другом, тогда вы можете сказать, что ничего плохого на самом деле не происходит .

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

Надеюсь, это поможет:)

0 голосов
/ 19 ноября 2018

1) Прерывание между A и B вызовет разрыв связи (spawn_link) между процессами на A и B, так как у нас все еще есть C в качестве промежуточного связанного узла.А как насчет monitor_node (будет ли он активирован на A или B)?

2) Можем ли мы по-прежнему отправлять сообщения из процесса A в процесс B, поскольку C работает как промежуточный связанный узел?

Erlang имел службу с именем epmd(Erlang Port Mapper Daemon), которая будет транслировать информацию об узлах (ip, name) на другой узел, и эти узлы сохранят их.Это означает, что каждый узел имеет информационную карту о других узлах.Таким образом, если прерывание сети может восстановиться, и узел не мертв (перезапустить), узлы могут общаться как то же самое.Выше ситуация может.Теперь поговорим о ситуации, когда невозможно общаться, которая epmd(Erlang Port Mapper Daemon) не работает.В это время старые узлы хранят информацию друг друга, чтобы они могли вызывать друг друга.После перезапуска epmd созданные новые узлы теперь не могут вызывать старые, поскольку старые не передают свою информацию.

3) Как компоненты членства в Erlang / Elixir решают эту ситуацию?Будет ли восстановлено соединение, и в конце концов ничего плохого не произойдет (никакая связь не разорвана, не будет возвращено сообщение monitor_node, как будто все сразу восстанавливается)?

monitor_node получит сообщение {nodedown, Node}, еслисвязь с ним потеряна.spawn_link просто свяжите два процесса и может получить только процесс вниз сообщения MSG .

...