1

これは、私の前の質問で進行中の議論に関連しています

共有データとは対照的に、メッセージ パッシングのパフォーマンス ペナルティ

議論されている問題の 1 つは、メッセージ パッシングと共有状態を使用して Erlang で分散アルゴリズムに必要な作業量でした。私の見解では、メッセージの損失に対して堅牢なアルゴリズムを設計するよりも、共有状態 (おそらく DB のレコード) を使用して分散リーダー選出を実装する方が簡単です。ではない?

メッセージパッシングベースのアルゴリズムを実装する際の問題は、分散アルゴリズムをメッセージの損失に対して堅牢にするか、複数の試行が必要な場合でもメッセージが常に配信されるようにする必要があることです。もちろん、分散リーダー選出はよく知られた問題であり、堅牢なメッセージ パッシング アルゴリズムが既に存在していると思います (ナンシー リンチの本がそれを示している可能性があります) が、私はこの問題を要点を説明するための例として取り上げているだけです。

ありがとう!

4

4 に答える 4

4

メッセージ送信は非同期で安全です。受信者が存在する場合、メッセージは最終的に受信者に到達することが保証されます。

プロセスが終了すると、リンクされたすべてのプロセスに終了シグナルが発行されます。

分散環境では、erlang:monitor_node/2 を使用してノードのステータスを監視することもできます。ドキュメントから、

接続が失われた場合、メッセージ {nodedown, Node} が受信されます。

IMO、あなたがする必要があるのは、接続損失を処理することだけです。

于 2009-11-28T01:55:45.877 に答える
2

人生の多くのこと:それは依存します。

ここで話しているスケールによって異なります。あなたの共有状態の特徴は何ですか? それが SPOF (「単一障害点」) である場合、フォールト トレランスの問題と、おそらくアクセスの問題 (帯域幅、処理) に直面することになります。

フォールト トレランスがあまり考慮されていない小規模なシステムについて話している場合は、中央の DB を使用する方が簡単かもしれません。

繰り返しになりますが、私は質問について少し混乱しています。メッセージパッシングは通信の側面を扱いますが、データベースはストレージの側面を扱うために使用されます。あなたの質問でこれらのことが混同されているように感じるのはなぜですか? (もちろん私だけかもしれません)。


メッセージパッシングの堅牢性について: ここでの実際の問題は何ですか? 通信層が TCP であることは、この地球上で不完全ではありますが、非常に役立ちます。ノード間の通信の全体的な複雑さが気になる場合は、選択したプラットフォーム/言語に関係なく、これはなくなりません。Erlang は、分散通信を非常に簡単にします。

于 2009-11-27T21:31:06.227 に答える
2

質問/ディスカッションで奇妙な仮定をしていると思います。メッセージが消える可能性はあるが、共有状態を操作することは常に機能し、決して失敗しないことを受け入れてから、アルゴリズムの複雑さを比較しようとします。そのようには機能しません。物事がうまくいかないとき、彼らはそうするでしょうが、プログラムされています。並行システムを構築するために変更可能な共有状態を使用するのは困難ですが、それを使用して堅牢な並行システムを構築することは、正しい野郎です。

実際の分散システムでは、堅牢であることを確認したい場合、メッセージが届かない可能性があることを常に考慮する必要があります。これが正確にどのように行われるかは、アプリケーションによって異なります。

于 2009-11-27T23:06:50.553 に答える
2

「実装の問題」と言うところから、トートロジーがあります。

メッセージパッシングまたは共有状態を使用してアルゴリズムを実装するかどうかに関係なく、コードは堅牢にするためにエラーを処理する必要があります。どうしてもエラー処理を気にすることはできませんが、コードは定義上堅牢ではありません。あなたが「Erlang はロバストであるためにこれこれをしなければならない」と言い、「しかし、データベースの行を更新することはできますし、それは常に機能します」と言うなら、あなたはリンゴとリンゴを比較していません。いずれにせよ、データベース (または共有状態) が最初の試行で常に機能するという記述は、明らかに誤りです。

したがって、メッセージ パッシングを使用して実装するには、メッセージ パッシング コンストラクトを十分に高いレベルにラップして、アプリケーション プログラマーが使用するのに適した API が必要ですが、失敗のチェックと処理はプログラマーの責任です。

要約すると、次のようになります (これがトートロジーであると言った理由です)。

a) メッセージ パッシングを使用する場合、コードは「メッセージが正常に配信されるか、エラー (タイムアウト) が発生する」を実装する必要があります。

b) データベースを使用している場合、コードは「行が正常に更新されるか、エラーが発生する」を実装する必要があります。(同じことが共有状態ソリューションにも当てはまります)。

a と b は同等であるため、あなたが話している「問題」は、メッセージ パッシングとデータベース アプローチに等しく適用されるため、これ以上議論する必要はありません。

どちらがより簡単か (またはより適切か) については、単純な答えはありません。賢明な答えは、「問題のドメインにより適したアプローチを使用する」ことです。Erlang について話すときは、OTP などの使用しているライブラリ/ツールも考慮する必要があります。それらは、これらを実装する方法に大きな影響を与える可能性があるためです。

于 2009-11-30T05:04:27.220 に答える