2つのエンティティ間でシグナルとデータを送信する必要があるアプリケーションがあります。ベストプラクティスとその理由はどちらですか?
- 4つのソケットを開きます。2つは両方向の信号用、2つは両方向のデータ用です。
- データと信号用にそれぞれ2つのソケットを開きます
- 1つのソケットを開き、信号とデータをフィルタリングするだけです
まず、ソケットは全二重です。つまり、送信と受信に個別のソケット(接続)は必要ありません。
第二に、詳細を説明せずに判断するのは困難です。ただし、HTTP(コマンド/ヘッダーとデータの1つの接続)とFTP(コマンドとデータの個別の接続)の履歴を知っていると、HTTP設計者がより適切な選択をしたように見えます。2つの接続は維持するためのより多くのコードです。また、一部のファイアウォールは、データの大部分が転送されるときに、ハングしたアイドル状態のFTPコマンド接続を好みません。
したがって、1つの接続を選択すると、信号とデータ(フラグ、ヘッダーなど)を簡単に区別できます。また、着信チャネルと発信チャネルは完全に直交しています。
別の方法: 0MQのようなリアルタイムアプリケーション用に構築された専用のミドルウェアを使用します。
ØMQをインスタンス化するには:
Jzmq obj = new Jzmq (hostname);
ここで、hostnameは、zmq_serverが実行されているボックスの名前またはIPアドレスです。
配線を作成するには、createExchange、createQueue、およびbind関数を使用できます。配線機構の仕組みの詳細については、こちらをご覧ください。
int eid = obj.createExchange ("E", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5555");
obj.createQueue ("Q", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5556");
obj.bind ("E", "Q");
メッセージの送信は非常に簡単です。メッセージはバイト配列の形式で提供されます。
byte msg [] = {1, 2, 3, 4, 5, 6};
obj.send (eid, msg);
メッセージの受信はさらに簡単です。
byte [] msg = obj.receive ();
完全なサンプルはこちらから入手できます。
すべてのデータ用に1つのソケット、すべての信号用に1つのソケットを用意できないのはなぜですか。同じソケットからリモートエンティティからの信号を読み取りながら、リモートエンティティに信号を送信できます。これは、FTP(非パッシブ)がどのように機能するかのようなもので、制御接続があり、実際のデータ転送に使用されます。
ソケットが4つあるのはやり過ぎのようですが、信号やデータが何であるかはわかりません。
ネットワーク通信をデコードするためのコードを増やしてもかまわない場合は、すべてを1つのソケットで確実に実行できます。実際のコミュニケーションについてもっと考える必要があります。必要に応じて、より適切な「プロトコル」を使用してください。2ソケットモデルと1ソケットモデルの両方で問題ありません。
考えられる「中道」があります。JBossリモーティングなどを使用して、1つの実際のソケットの上に複数の仮想ソケットを多重化します。このようにして、アプリケーションレベルでデータチャネルと制御チャネルを分離し、オペレーティングシステムレベルで必要なTCPポートは1つだけ(したがって、ファイアウォールの穴は最大1つ)にすることができます。