(フルフィーチャーされた)長いポーリングサーバーは抽象的にどのように機能しますか

StackOverflow https://stackoverflow.com/questions/3153959

質問

スレッドとは対照的にイベントループを使用しているため、実際のサーバーはどのように見えますか?

イベントループを使用していることは知っていますが、リクエストをどのように分離しますか?そして、どのようにあなたのサーバーが非常にゆっくりと実行されるのを防ぐのですか(それは、それがスレッドレスなので、一度に1つしかプッシュできないと思いますか?)

ある種の擬似コードが素晴らしいでしょう。

私の無知を許してください。もちろん、「1000人の訪問者の道を手に入れるまで、これは十分に良い」という基本的でない場所で説明する場所がある場合、私はそれを知ってうれしいです。

役に立ちましたか?

解決

長い世論調査サーバーの実装の詳細は、プラットフォームごとに大きく異なるため、仮定が正しくない可能性があります。

Cometサーバーを実装しました 私たちのウェブサイト .NETを使用します。私はレバレッジしました httplistener すべての退屈なhttpのことをするために Microsoft CCR すべての非同期IOに対処するため。スレッドのプールを使用してリクエストを使用します。クライアントごとにスレッドではありませんが、ユーザー番号が上昇するにつれて流動的なままにするために数十のスレッドが必要な単一のスレッドではありません。このアプローチは、複数のCPUコアを越えて簡単にスケーリングすることを意味します。 CCRS Async Enumerator Patternは、非同期ロジックを素晴らしく整頓するのに本当に役立ち、1年後にはかなり簡単にコードを読むことができます。

このアプローチは非常にスケーラブルであることが証明されています。最大20000人のクライアントをテストしましたが、ネットワークIOに拘束されました。 1〜2%のサーバー負荷でカチカチと音がするすべてのクライアント(「永続的に」接続され、30代ごとに再接続する)を処理します。複数のスレッドではなく、イベントループアーキテクチャを選択する必要があるという仮定を再検討する価値があります。中間地面は私にとって非常にうまく機能し、 .NET非同期プログラミングモデル IOバインドされたタスクに対処するには、マイクロマネージスレッドへの必要性から本当に離れています。事実上、処理するIOデータがある場合、その処理を行うためにプールからスレッドが借用され、その後、別のリクエストに対応する準備ができているプールに戻ります。 すべての複雑なIOCPのもの 抽象化されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top