3

あらゆる種類のポートが閉じられたあらゆる種類のファイアウォールの背後にある世界中に分散されたクライアントから、サーバーから対話型メッセージを取得する必要があるクライアントがいます。信頼できる唯一のものは、HTTP ポート 80 (および HTTPS 443) です。

設計は基本的に XMPP (Jabber プロトコル) をモデルにしており、クライアントと IIS を使用しています。クライアントは .NET ハンドラーに GET 要求を発行します。ハンドラーは、メッセージを探している間、リクエストを開いたままにします。メッセージが到着すると、すぐにクライアントに送信されます。そうでない場合、タイムアウト後、接続は「データなし」応答で閉じられます。クライアントはすぐに通信を再開します。

まあ、理論的には。

実際に何が起こっているかというと、まず、IIS は約 100 を超える同時要求を処理できません。他の要求はすべてキューに入れられており、「接続」とクライアントが呼び出したことを IIS が認識するまでに数分の遅れが生じる可能性があります。次に、約半分の時間です。クライアントはサーバーからの応答なしにタイムアウトします (クライアントのタイムアウトはサーバーのタイムアウトより 5 分長くなります)。

POST は常に機能します。同じ Web サーバーで提供される他のデータは機能します。同じサーバー上の Web サービスが動作します。これは、Windows 2K3 Server ですぐに使用できるインストールです。

不足している構成オプションはありますか、またはこれに対処するために他に確認する必要があるものはありますか?

ありがとう。

4

4 に答える 4

3

IISの制限ではなく、ASP.NETのスレッドプールの制限に達していると思います。非同期HTTPハンドラー(IHttpAsyncHandler)を作成することを検討してください。ブロック/待機するときは、スレッドプールを拘束していません(代わりに完了ポートを使用します)。

更新:私の考えと一致しているように見える最近これに出くわしました:CodeProject:ASP.NETと組み合わせたスケーラブルなCOMET

于 2008-09-25T23:15:26.713 に答える
1

IISが要件に合わない場合は、ApacheMod_monoを使用)やLightTPDなどの別のWebサーバーを選択する必要があります。

ところで、 XMPP Over BOSHを使用して、HTTPを介してXMPPをトンネリングできます。カスタムプロトコルを発明する必要はありません。

于 2008-09-24T01:47:31.637 に答える
1

箱から出してすぐに、ウィンドウには微調整が必​​要です。私は asp.net にコメット サーバーを実装する必要があり、いくつかのばかげたデフォルトに遭遇しました。これらのリンクを読んだ後:

Windows 2k8サーバーに加えられた次の変更を思いつきました。

  • reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameters /v MaxConnections /t REG_DWORD /d 1000000 /f
  • reg add HKLM\System\CurrentControlSet\Services\TcpIp\Parameters /v TcpTimedWaitDelay /t REG_DWORD /d 30 /f
  • reg add HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentThreadsPerCPU /t REG_DWORD /d 0 /f
  • reg add HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentRequestsPerCPU /t REG_DWORD /d 30000 /f
  • appcmd.exe set apppool "[アプリ プール名]" /queueLength:65535
  • appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000
  • reg add HKLM\System\CurrentControlSet\Services\TcpIp\Parameters /v MaxUserPort /t REG_DWORD /d 65534 /f
  • reg add HKLM\System\CurrentControlSet\Services\TcpIp\Parameters /v MaxFreeTcbs /t REG_DWORD /d 2000 /f
  • reg add HKLM\System\CurrentControlSet\Services\TcpIp\Parameters /v MaxHashTableSize /t REG_DWORD /d 2048 /f reg add HKLM\System\CurrentControlSet\Services\InetInfo\Parameters /v MaxPoolThreads /t REG_DWORD /d 80 /f
  • appcmd set config /section:processModel /requestQueueLimit:100000 /commit:MACHINE

すべての変更が必要だったのか最適だったのかはわかりませんが、テスト サーバーに対して簡単なテストを行ったところ、30,000 を超える実行接続と 5,000 のリクエスト/秒を達成しました。テストを実行するクライアント マシンが不足しているため、先に進むことができませんでした。

于 2010-08-28T23:57:46.153 に答える
0

XMPP は、高性能アプリケーション用に設計されたことはありません。メッセージはスタック全体を通過してアプリケーション層に到達する必要があり、多くの XML 解析が必要です。XMPP 以外の標準を使用することを検討しましたか?

于 2010-08-24T21:19:42.977 に答える