私はこのような状況にあります.... 1 つのサーバーと、たとえば数万のクライアントの間でクライアントが開始する SOAP 1.1 通信。クライアントは外部にあり、ファイアウォールを通過し、証明書や https などで認証されます。クライアントはどこにでもあり、通常は独自のファイアウォール、NAT ルーターなどを持っています。リモートの企業オフィスだけでなく、真に外部に存在します。それらは、企業/キャンパス ネットワーク、DSL/ケーブル、さらにはダイヤルアップにある可能性があります。
クライアントは Delphi (2005 年 + 2007 年からの SOAP 修正) を使用し、サーバーは C# ですが、アーキテクチャ/設計の観点からは問題ありません。
現在、クライアントは新しいデータをサーバーにプッシュし、15 分間のポーリング ループでサーバーから新しいデータをプルします。サーバーは現在、データをプッシュしません。クライアントは、プルする新しいデータがあるかどうかを確認するために、「messagecount」メソッドをヒットします。0 の場合、さらに 15 分間スリープし、再度チェックします。
これを 7 秒に短縮しようとしています。
これが 1 つまたは数十のクライアントを持つ内部アプリである場合、サイレントな「リスナー」SOAP サービスを作成し、それにデータをプッシュします。しかし、それらは外部にあり、独自のファイアウォールの背後にあり、時には NAT ルーターの背後にあるプライベート ネットワークであるため、これは実用的ではありません。
そのため、はるかに高速なループでポーリングする必要があります。それぞれが 10 秒ごとにメッセージ数をチェックする 10,000 のクライアントは、帯域幅、サーバー、ファイアウォール、およびオーセンティケーターのリソースを浪費するだけの 1000/秒のメッセージになります。
そのため、自傷行為による DoS 攻撃に相当するものよりも優れたものを設計しようとしています。
サーバーが SOAP メッセージをクライアントに送信 (プッシュ) することは、クライアント側で多くの構成が必要になるため、実用的ではないと思います。しかし、私が知らない代替手段があると思います。そのような:
1) クライアントが Soap 1.1 経由で GetMessageCount() のリクエストを作成し、応答を取得する方法はありますか?新しいデータの場合に追加の応答を取得するために、おそらく 5 ~ 10 分間「待機」します。到着?つまり、サーバーは「0」と言い、1 分後に何らかの SQL トリガー (サーバーは Sql Server 上の C# です) に応答して、このクライアントがまだ「オンライン」であることを認識し、更新されたメッセージ カウント「5」を送信します。 "?
2) 最後の GetMessageCount() リクエストから収集した情報を使用して、クライアントに「ping」するために使用できる他のプロトコルはありますか?
3) 私も知りません。クライアントがGetMessageCount()リクエストを送信できる魔法のプロトコルを探していると思います。これには、「ちなみに、次の1時間で回答が変わる場合に備えて、このアドレスでpingしてください... "。
また、何千もの接続を同時に開いたままにしておく必要があるため、これらの「回線を開いたままにする」スキームのいずれかがサーバーのサイジングに深刻な影響を与えると思います。それはファイアウォールにも影響を与える可能性が高いと思います。
そのようなものはありますか?それとも、私はポーリングにかなりこだわっていますか?
ティア、
クリス
2010 年 4 月 30 日更新:
特にHTTPS/SOAP/ファイアウォールの企業標準から逸脱しない限り、7秒の通知を行うことは簡単でも安価でもないことを実証したので、おそらく2段階のソリューションを売り込むつもりです. フェーズ 1 では、SOAP を介して実行される GetMessageCount を使用して、クライアントに「オンデマンド」でポーリングを行わせます。新しいデータを取得するための「更新」ボタンがあります (これは合理的です。ユーザーは通常、新しいデータの準備ができていると疑う理由があるためです。つまり、オンライン システムでファブリックの色を変更しただけなので、クリックする必要があることを知っているためです)。デスクトップで出荷マニフェストを表示する前に更新すると、説明に色が表示されます.) (これは実際には衣服/ファッションアプリではありませんが、アイデアはわかります.) 2 つの AP を常に同期させるという概念は、ここで説明するテクノロジーを使用して、ホストからプッシュされたリアルタイムの更新を使用して、まだ検討中です。しかし、これを行わなくても機能の 85% を提供できるため、別のリリースに延期されることを期待しています。ただし、概念実証を行い、それが機能することを実証できることを願っています. 戻ってきて、将来のアップデートを投稿します。これについてみんなの助けをありがとう。