質問
TCP経由で2つのプロセスを接続したいのですが、どちらがサーバーでどちらがクライアントであるかを指定する必要はありませんが、お互いのIPとホストを知っています。どちらがサーバーでどちらがクライアントであるかを独自に決定し、接続を開始する必要があります。
バックグラウンド
私は、RPC とは対照的に、クライアント/サーバー モデルがない双方向分散フレームワークに取り組んでいます。代わりに、分散コンポーネントは、ホストとポートを指定することで互いに通信できるようにする必要があります。
編集:概念は、ソケット接続の実装の詳細を超えています。これは、ソフトウェア エンジニアリングの観点から分散アプリケーションの設計を簡素化するための新しい概念です。これは、RPC や SOA (サーバー/クライアント指向) やメッセージ指向システム (IMO 非直感的なパターンの使用を要求する) とは対照的です。
ソリューションは、
- TCP の信頼性と SSL の使用の可能性が必要なため、UDP 経由でプロトコルを定義する
- ターゲット プラットフォームでバイナリ パッケージを使用できないため、ZeroMQ のようなフレームワークを使用する
- edit : グローバル メッセージ ブローカー / ネーム サーバー。追加のプロセスを必要としない軽量なソリューションであるためです。そして、そのようなノードを追加すると、クライアント/サーバーの概念が再導入されるだけです
アップデート
議論の結果、有用なアプローチは 1 つしかないように思われます。すべてのピアにリスト ソケットが必要です (または、もちろん自動検出を行うことはできません)。接続要求時に、まだ開いている接続がない場合、ノードは他のピアへの接続を試みます。
これは、接続が同時に行われる場合に問題になる可能性があるため、2 つのピア間で 2 つの接続が発生することになります。問題は、非同期コンテキストでそれを処理する方法です。1 つの接続のみが閉じられていることを保証する必要があるため、これは以下のコメントで述べたほど簡単ではないと思います。この作業には 2PC のようなプロトコルが必要だと思います。