TCP の信頼性を備えたブロードキャストのような UDPに対する回答の 1 つで、あるユーザーがSpreadメッセージング APIについて言及しています。ØMQと呼ばれるものにも出くわしました。MPIにもある程度精通しています。
ですから、私の主な質問は、なぜ一方を他方よりも選択するのでしょうか? より具体的には、MPI の成熟した実装があるのに、なぜ Spread または ØMQ を使用することを選択するのでしょうか?
TCP の信頼性を備えたブロードキャストのような UDPに対する回答の 1 つで、あるユーザーがSpreadメッセージング APIについて言及しています。ØMQと呼ばれるものにも出くわしました。MPIにもある程度精通しています。
ですから、私の主な質問は、なぜ一方を他方よりも選択するのでしょうか? より具体的には、MPI の成熟した実装があるのに、なぜ Spread または ØMQ を使用することを選択するのでしょうか?
MPI は、高速で信頼性の高いネットワークを備えた密結合の計算クラスターとして設計されました。Spread と ØMQ は、大規模な分散システム向けに設計されています。並列科学アプリケーションを設計している場合は MPI を使用しますが、障害やネットワークの不安定性に対する回復力が必要な永続的な分散システムを設計している場合は、他のいずれかを使用してください。
MPI のフォールト トレランス機能は非常に限られています。ほとんどの実装におけるデフォルトのエラー処理動作は、システム全体の失敗です。また、MPI のセマンティクスでは、送信されたすべてのメッセージが最終的に消費される必要があります。これは、クラスターでのシミュレーションでは意味がありますが、分散アプリケーションでは意味がありません。
私はこれらのライブラリを使用したことがありませんが、いくつかのヒントを提供できるかもしれません。
つまり、並列システムを構築しようとしているのか、分散システムを構築しようとしているのかによって大きく異なります。それらは互いに関連していますが、暗黙の意味合い/目標は異なります。並列プログラミングは、複数のコンピューターを同時に使用することで計算能力を向上させます。分散プログラミングは、信頼できる (一貫性があり、耐障害性があり、可用性が高い) コンピューターのグループを扱います。
「信頼性」の概念は、TCP とは少し異なります。TCP の信頼性は、「このパケットは何があってもエンド プログラムに渡してください」です。分散プログラミングの信頼性は、「一部のマシンが停止しても、システム全体が一貫して動作し続ける」ことです。すべての参加者が確実にメッセージを受け取るようにするには、2 フェーズ コミットまたはより高速な代替手段が必要です。
ここでは、提供されるサービスの種類とそれぞれのインフラストラクチャに関する異なる概念を使用して、非常に異なる API に対処しています。私は MPI と Spread について十分な知識を持っているわけではありませんが、ZeroMQ についてはもう少しお手伝いできます。
ZeroMQ は、単純なメッセージング通信ライブラリです。共通のメッセージング パターン (PUSH/PULL、REQUEST/REPLY、PUB/SUB など) の制限されたセットに基づいて、さまざまなピア (ローカルのものを含む) にメッセージを送信するだけです。これらのパターンに基づいて、クライアントの接続、取得、および基本的な輻輳を厳密に処理し、残りは自分で行う必要があります。
非常に制限されているように見えますが、この単純な動作は、ほとんどの場合、アプリケーションの通信層に必要なものです。ノード間の単純なプロキシとゲートウェイを使用して、すべてメモリ内の単純なプロトタイプから、さまざまな環境のより複雑な分散アプリケーションに非常に迅速にスケーリングできます。ただし、ノードの展開、ネットワークの検出、またはサーバーの監視を行うことを期待しないでください。あなたはそれを自分でしなければならないでしょう。
簡単に言うと、アプリケーションを単純なマルチスレッド プロセスから分散環境や可変環境にスケーリングしたい場合、または迅速に実験してプロトタイプを作成したいがモデルに適合するソリューションがないように思われる場合は、zeromq を使用します。ただし、非常に大規模なクラスターにスケーリングする場合は、ネットワークの展開と監視にある程度の労力を費やす必要があると予想してください。