私は Azure クラウドに取り組んでおり、主にIO バウンドであるスケーラブルな HTTP サーバーを実装しようとしています。
明確化:例を手元に用意するために、サーバーが "BLOB プロキシ" であると仮定します。つまり、クライアントが接続すると、サーバーは Azure Storage から BLOB をダウンロードし、それをクライアントにストリーミングします。それでおしまい。
もちろん、私の目標は、単一のマシンから最大の同時クライアントを絞り出すことです。
node.js から学ぶ
node.js は、この種の問題に非常に自然に適合するようです。サーバーが行うのは IO だけです。ノードは完全に非同期であり、1 台のマシンでおそらく数万の同時処理に達する可能性があります。
私は最終的に node.js ではなく、c# と .net フレームワークを支持することを選択しました。また、c# が提供するものと同様の戦略を実装しようとしています。ノードを複製しようとしているのではなく、そのアプローチのみです。
Azure での私の c# 実装
現在、IIS にシン Web ロールを含む Azure クラウド サービスがあります。ここにあるMyHandler.ashx
:
public class MyHandler : HttpTaskAsyncHandler
{
public override async Task ProcessRequestAsync(HttpContext context)
{
CloudBlockBlob blob = GetBlockBlobReference(...);
await blob.DownloadToStreamAsync(context.Response.OutputStream);
}
}
私は私の中にこの単純なルーティングを持っていますWeb.config
:
<system.webServer>
<handlers>
<add verb="*" path="*" name="MyHandler" type="MyWebRole.MyHandler" />
</handlers>
</system.webServer>
討論:
.net 4.5 の新しい async/await API は、node.js の JS と同じくらい非同期で、使いやすいと期待しています。この仮定に重大な誤りはありますか?
同時実行数を最大化するには、Azure Web ロールのどの調整/最適化を行う必要がありますか?
デフォルトではコア数の 12* しかないため、最大接続数を増やす必要があると聞きました。これは本当ですか、それはどのように正確に行われますか?
デフォルトのスレッドプールを変更するために何かする必要がありますか?
他に重要なヒント/調整/最適化はありますか?
IIS を完全に削除する必要がありますか? Worker ロールでホストできる「無駄のない」サーバー実装がいくつかあります。これにより、IIS に比べてパフォーマンスが大幅に向上しますか? 苦労する価値はありますか?
全体として、私は正しい軌道に乗っていますか? c#/.net でこれを行うより良い方法はありますか?