4

私は 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>

討論:

  1. .net 4.5 の新しい async/await API は、node.js の JS と同じくらい非同期で、使いやすいと期待しています。この仮定に重大な誤りはありますか?

  2. 同時実行数を最大化するには、Azure Web ロールのどの調整/最適化を行う必要がありますか?

    • デフォルトではコア数の 12* しかないため、最大接続数を増やす必要があると聞きました。これは本当ですか、それはどのように正確に行われますか?

    • デフォルトのスレッドプールを変更するために何かする必要がありますか?

    • 他に重要なヒント/調整/最適化はありますか?

  3. IIS を完全に削除する必要がありますか? Worker ロールでホストできる「無駄のない」サーバー実装がいくつかあります。これにより、IIS に比べてパフォーマンスが大幅に向上しますか? 苦労する価値はありますか?

  4. 全体として、私は正しい軌道に乗っていますか? c#/.net でこれを行うより良い方法はありますか?

4

2 に答える 2

1

ここで車輪を再発明しないことを真剣に提案します。IIS の最新バージョンでは、websocket がサポートされており、非同期の要求/応答がしばらくの間利用可能でした。

肥大化に関するあなたのコメントに関しては、あなたはまだかなり痩せている可能性があります. ビュー エンジンとルーティング エンジンに関しては、それを使用する必要はありませんどの時点で、本当に必要なものは何ですか? 別のビュー エンジンまたはカスタム ビュー エンジンを登録/使用できます。レンダリング部分は非常に小さいレベルの相互作用であり、特に出力キャッシュと組み合わせると、ここで言及する価値はほとんどありません。

それは、NodeJS が提供する何を達成しようとしているかに大きく依存します。NodeJS の最大のセールス ポイントは、大量の IO およびイベント バウンドの負荷に対して、同時に接続されている何千ものユーザーを処理できることです。主に IO 用の filesystem/db/services とイベント バインディング用の WebSockets。

特定のアプリケーションをプロファイリングしないと、アドバイスを与えることはできません。ASP.Net + IIS (最新バージョン) のボックスには多くの機能があることを考えると、車輪の再発明を行う場合は、実際のニーズを正確に把握することが重要です。


この場合、IIS で CDN タイプのロードを行いたいようです。この場合、IIS に固執したい場合は、おそらく HTTP モジュールを使用する必要があります。

認証されたユーザーにリソースを制限する必要がない場合は、フロントロードされた CDN またはキャッシング リバース プロキシを検討することをお勧めします。IIS+.Net の強力な統合により、IIS+.Net に固執している間は、他の方法で話している肥大化の多くを回避することはできません。

さらに、Microsoft は Azure Blob Storage を基盤とする CDN ソリューションを既に提供しています。認証が必要な場合は、これがおそらく最善の策です。これにも方法があると思います。いずれにせよ、ASP.Net MVC または WebService インターフェイスを介して、おそらく .Net および C# で必要なことを行うことができます...ビューは必要ありません。


余談ですが、私は node.js がとても好きで、問題のサービスのいくつかの node.js インスタンスの前に varnish を使用することをお勧めします。Azure は Linux VM をサポートしており、Ubuntu と Docker を使用してきましたが、これは非常にうまく機能しています。

于 2013-08-24T00:16:49.703 に答える