8

Erlangのフォールトトレランス(私が理解しているように)には、スーパーバイザープロセスを使用してワーカープロセスを監視することが含まれているため、ワーカーが死亡した場合、スーパーバイザーは新しいプロセスを起動できます。

特に分散シナリオでは、Erlangはこの監視をどのように行いますか?プロセスが実際に停止したことをどのように確認できますか?ハートビートはありますか?ランタイム環境に何かが組み込まれていますか?ネットワークケーブルが接続されていない場合はどうなりますか?他のプロセスと通信できない場合、他のプロセスが停止したと見なされますか?等

私は、JVM(JavaやScalaなど)でErlangが主張するのと同じフォールトトレランスなどを実現する方法を考えていました。しかし、Erlangと同様に、JVMに組み込まれたサポートが必要かどうかはわかりませんでした。比較のポイントとして、Erlangがどのようにそれを行うかについての定義にまだ出くわしていませんでした。

4

4 に答える 4

5

Erlang OTP スーパービジョンは通常、異なるノード上のプロセス間では実行されません。それは機能しますが、ベスト プラクティスは別の方法で行うことです。

一般的なアプローチは、各マシンで実行されるようにアプリケーション全体を作成することですが、アプリケーションは単独ではないことを認識しています。また、アプリケーションの一部にはノード モニターがあり、ノード ダウンを認識します (これは単純なネットワーク ping で行われます)。これらのノードのダウンは、負荷分散ルールを変更したり、別のマスターにフォールオーバーしたりするために使用できます。

この ping は、ノードダウンの検出に遅延があることを意味します。デッド ピア ノード (またはピア ノードへのデッド リンク) を検出するには、かなりの数秒かかる場合があります。

スーパーバイザとプロセスがローカルで実行されている場合、クラッシュとスーパーバイザへのシグナルはほぼ瞬時に発生します。これは、異常なクラッシュが、終了をトラップしない限りクラッシュするリンクされたプロセスに伝播するという機能に依存しています。

于 2009-07-20T14:38:03.907 に答える
0

誰かがScala で同様の戦略を実装したようです。私の予想では、スーパーバイザーはネットワーク障害を失敗したサブプロセスとして扱い、Scala プロセスに関するドキュメントはこれを裏付けているようです。

于 2009-07-19T05:25:29.620 に答える
0

スーパーバイザーはポートマッパーを処理するという意味だと思います。JInterfaceを介して Erlang ポートマッパー/インフラストラクチャを利用できます。したがって、車輪の再発明を回避できます。それでも必要な場合は、少なくともそこに記述されているすべてのインターフェースを取得できます。

于 2009-07-19T06:04:54.283 に答える
-1

Erlang はオープンソースです。つまり、ソースをダウンロードして、 Erlang がどのようにそれを行うかについての決定的な答えを得ることができます。

特に分散シナリオでは、Erlang はこの監視をどのように行うのでしょうか? プロセスが本当に停止したことをどのように確認できますか? 心臓の鼓動はしますか?ランタイム環境に何かが組み込まれていますか?

BEAM ランタイムで行われていると思います。プロセスが終了すると、それにリンクされているすべてのプロセスにシグナルが送信されます。完全な議論については、プログラミング Erlangの第 9 章を参照してください。

ネットワーク ケーブルが抜かれた場合はどうなりますか? 他のプロセスと通信できない場合、他のプロセスが停止したと見なされますか? 等

{node_up, Node}Erlang では、ノードを監視し、メッセージを受信することを選択でき{node_down, Node}ます。ノードと通信できなくなった場合、これらも送信されると思います。それらをどのように扱うかはあなた次第です。

于 2009-07-21T02:16:38.767 に答える