2009-07-19 9 views
8

Erlangのフォールトトレランスには、スーパーバイザプロセスを使用してワーカープロセスを監視する機能が含まれているため、ワーカーが死亡した場合、スーパーバイザは新しいものを起動できます。スーパーバイザプロセスはプロセスをどのように監視しますか?同じことをJVM上で行うことはできますか?

Erlangは、特に分散シナリオでこの監視をどのように行うのですか?どのようにしてプロセスが本当に死んだのかを確認することができますか?それは心拍をするのですか?実行時環境に何か組み込まれていますか?ネットワークケーブルが接続されていない場合はどうなりますか?他のプロセスと通信できない場合、他のプロセスが終了したと想定していますか?

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

答えて

5

Erlang OTP監視は通常、異なるノードのプロセス間で行われません。それはうまくいくが、ベストプラクティスは違うやり方だ。

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

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

スーパーバイザとプロセスがローカルで実行されている場合、クラッシュとスーパーバイザへの信号はほとんど瞬間的です。異常クラッシュがリンクされたプロセスに伝播するという機能に依存しています。

+0

ありがとう、それは多くの意味があります。マシン間でメッセージを送信することは、ローカルプロセス間での送信(オーバーヘッドの増加、失敗する可能性のあるその他の理由など)とは異なることがよくあります。したがって、これについて知るようにアプリケーションをコーディングしてください(ローカルコールとリモートコールを同じにするための魅力はないので試してはいけません)。 これは、JVMの同様のモデルが確かに可能であることを意味します。ローカルプロセス/スレッド/ファイバー/アクター/その他を監督するだけで、他のノードへのアプリケーションのpingをコード化します(到達できない場合はどうすればよいか)。 –

0

誰かがsimilar strategy in Scalaを実装しているようです。私の期待は、監督者がネットワーク障害を失敗したサブプロセスとして扱い、Scalaプロセスに関するドキュメントがこれを裏付けているように見えることです。

+0

ありがとう - それは興味深い投稿でした。ネットワーク接続をサポートしていれば、それを解決しようとするメッセージを残しました。私は、JVM内で何か他のものを見ていて、クロスプロセスの境界問題に対処していなかったという感触(おそらく間違っている)を得ました。しかし、それがすべてうまくいくならそれは素晴らしいことでしょう! –

0

私はスーパーバイザプロセスがポートマッパーを処理していると思います。 JInterface経由でErlangポートマッパー/インフラストラクチャを利用することができます。これにより、少なくともそこに記載されているすべてのインターフェイスを手に入れたい場合に備えて、ホイールの再発明を避けることができます。

+0

ありがとうございましたが、私はJava VMを(Erlang VMなしで)使用したいと考えていました。物事をよりシンプルに(政治的に)保ちます。 –

-1

Erlangはopensourceです。つまり、download the sourceとなり、Erlangがどのようにそれを行うのかについての決定的な答えを得ることができます。

Erlangは、特に分散シナリオでこの監視をどのように行いますか?どのようにしてプロセスが本当に死んだのかを確認することができますか?それは心拍をするのですか?実行時環境に何か組み込まれていますか?

私はそれがBEAMランタイムで実行されたと信じています。プロセスが終了すると、それにリンクされているすべてのプロセスにシグナルが送信されます。詳しくは、Programming Erlangの第9章を参照してください。

ネットワークケーブルが抜かれた場合 - 他のプロセスと通信できない場合、他のプロセスが終了したと見なしますか?

Erlangでは、ノードを監視し、{node_up, Node}{node_down, Node}メッセージを受信することができます。私はあなたがもはやノードに話すことができない場合、これらも送信されると仮定します。それらをどう扱うかはあなた次第です。

関連する問題