一部のコンポーネントがファイアウォールの背後にある分散アプリケーションの開発

画像

新しいプロジェクトに入ってしばらくそこで働いたとき、コンポーネントが絶えず相互作用する必要がある分散アプリケーションでは、ファイアウォールのようなものの出現がシステムの開発において非常に重要な事実になることに気付きました。 すぐに対処する必要がある問題があり、それは個人的に常に私を幸せにします。 このトピックでは、この種のシステムを開発する際に留意すべきことを説明します。



ファイアウォールは通常、企業ネットワークの外部と内部のアプリケーション間、および通常はシステムが外部ユーザー向けに設計され、サーバーがイントラネット内にあるインフラストラクチャで行われるDMZの境界に表示されます。 さらに、クライアントからのメッセージは複数のDMZを通過し、複数のファイアウォールを通過できます。



ファイアウォールには、次の機能が追加されていることに注意してください。

  1. データを転送しない接続は、一定時間後に閉じます。
  2. データを送信しない接続はブラックホールになる可能性があります。これは、メッセージの送信、メッセージの送信は成功するが受信者には到達しないという形で現れます。
  3. 通信が通過するすべてのポートを事前に認識してファイアウォールに登録する必要があるため、このような環境では任意のポートを開くテクノロジーは機能しません。


上記の困難が問題を引き起こさないように、具体的に何をする必要があるかを見てみましょう。 Javaで例を示しますが、ほとんどはRMIを除き、他のプラットフォームでも同様です。



アイドル時に接続がファイアウォールによって閉じられないようにするには、ファイアウォールをアイドル状態にしないでください。 通常、これは、pingやハートビートなどの特定のサービスタイプのメッセージを導入することで実現されます。これらのメッセージは、特定の期間に両方向でネットワークを介して送信されます。 明らかに、時間間隔は、ファイアウォールがアイドル接続を閉じた後の間隔で、いくつかのサービスメッセージが送信されるように選択されます。 データベース接続プールを例として考えると、検証クエリはそのようなサービスメッセージとして機能します。 私はすでにこのことについてもっとここに書い



アイドル接続を閉じる問題を解決する2番目の方法は、時々接続を再作成することです。 たとえば、この機能はほとんどのデータベース接続プールで提供されています。



ブラックホールに対処するには、メッセージが受信者に届いたことを確認するために、リクエスト/レスポンス戦略を使用できます。 送信された各メッセージの短い応答を待ってから、コントロールをリリースしてください。 または、上記のように、接続をアイドル状態にしないでください。 ファイアウォールを越えてメッセージの配信を保証する方法の詳細については、 ここで詳しく説明しました



Javaで任意のポートを使用する最も一般的なテクノロジーは、おそらくRMIです。 これはかなり古くからある技術であり、広く使用されているとは言えません。 それは、現在ほとんどどこでも使用されているJMXであり、最も一般的な通信プロトコルとしてRMIを使用しています。 また、JConsoleを使用する場合は、おそらくこのプロトコルが必要になります。 ただし、RMIを使用するとポートを修正できるため、すべてがそれほど悪いわけではありません。 これを行う方法については、 ここで詳細に説明しました 。 確かに、メソッドをプルするだけでなく、クライアント上のサーバーから非同期通知(コールバック)も受信したい場合、ここでは成功しません。少なくとも、このためのポートを修正する方法はすぐには見つかりませんでした。 ただし、JMXではこの機能を使用することはありません。必要に応じて、ポーリングを通じていつでも実装できます。



また、実稼働環境でファイアウォールを使用している場合は、UAT環境で同じ設定のファイアウォールを使用することが非常に重要です。 何らかの理由でこれが不可能な場合、コンポーネント間のすべての接続を直接ではなく、接続を切断するか、特定の間隔後に接続がブラックホールに変わる特別なプロキシを介してインストールすることにより、少なくともエミュレートする必要があります。データは送信されませんでした。



All Articles