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 отказоустойчив, его не следует считать отказоустойчивым , т.е.обрабатывать ошибки.
Надеюсь, это поможет:)