31

これは、マルチスレッド化されたスケーラブルな HttpListener の良い例でしょうか?

これは、たとえば実際のIISが行う方法ですか?

public class Program
{
    private static readonly HttpListener Listener = new HttpListener();

    public static void Main()
    {
        Listener.Prefixes.Add("http://+:80/");
        Listener.Start();
        Listen();
        Console.WriteLine("Listening...");
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }

    private static async void Listen()
    {
        while (true)
        {
            var context = await Listener.GetContextAsync();
            Console.WriteLine("Client connected");
            Task.Factory.StartNew(() => ProcessRequest(context));
        }

        Listener.Close();
    }

    private static void ProcessRequest(HttpListenerContext context)
    {
        System.Threading.Thread.Sleep(10*1000);
        Console.WriteLine("Response");
    }
}

特に、IIS に依存しないスケーラブルなソリューションを探しています。代わりに http.sys (httplistener クラス) のみ -- iIS に依存しない理由は、政府が. 私が働いている地域では、攻撃の表面積を大幅に減らす必要があります。

4

4 に答える 4

25

https://github.com/JamesDunne/Aardwolfで同様のことを行い、これについて広範なテストを行いました。

コア イベント ループの実装については、 https://github.com/JamesDunne/aardwolf/blob/master/Aardwolf/HttpAsyncHost.cs#L107のコードを参照してください。

Semaphoreアクティブな同時GetContextAsyncリクエストの数を制御するためにa を使用することが最善の方法であることがわかりました。基本的に、メインループは、カウントに達したためにセマフォがスレッドをブロックするまで実行を続けます。次に、N 個の同時「接続受け入れ」がアクティブになります。接続が受け入れられるたびに、セマフォが解放され、新しい要求が代わりに使用されます。

セマフォの初期値と最大カウント値は、予想される負荷に応じて微調整する必要があります。これは、予想される同時接続数とクライアントが望む平均応答時間との間の微妙なバランスをとる作業です。値が大きいほど、より多くの接続を維持できますが、平均応答時間ははるかに遅くなります。拒否される接続が少なくなります。値が小さいほど、維持できる接続数は少なくなりますが、平均応答時間は大幅に短縮されます。それ以上の接続は拒否されます。

実験的に (私のハードウェア上で)、128サーバーが許容可能な応答時間で大量の同時接続 (最大 1,024) を処理できるようにする値を見つけました。独自のハードウェアを使用してテストし、それに応じてパラメーターを調整します。

また、WCAT の 1 つのインスタンスで 1,024 を超える接続を処理するのは好ましくないこともわかりました。したがって、負荷テストに真剣に取り組んでいる場合は、サーバーに対して WCAT を備えた複数のクライアント マシンを使用し、10 GbE などの高速ネットワークでテストし、OS の制限によって速度が低下していないことを確認してください。デスクトップ SKU は既定で制限されているため、必ず Windows Server SKU でテストしてください。

概要: 接続受け入れループをどのように記述するかは、サーバーのスケーラビリティにとって重要です。

于 2012-09-24T00:34:01.020 に答える
5

技術的には、あなたは正しいです。スケーラブルにするために、おそらく複数の GetContextAsync を同時に実行する必要があります (パフォーマンス テストでは正確な数を知る必要がありましたが、「コアごとにいくつか」がおそらく正しい答えです)。

それから当然、コメントで指摘されているように。IIS を使用しないということは、IIS が「無料」で提供する多くのセキュリティについて真剣に考える必要があることを意味します。

于 2012-09-13T22:52:18.373 に答える