3

スレッドではなくイベント ループを使用しているため、実際のサーバーはどのように見えるでしょうか。

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

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

私の無知を許してください。もちろん、「1000人の訪問者を獲得するまではこれで十分です」という非基本的な説明がどこかにある場合は、それを知っていただければ幸いです.

4

1 に答える 1

5

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

.NETを使用してWebサイトにCOMETサーバーを実装しました。私はHttpListenerを利用して、退屈なhttpをすべて実行し、MicrosoftCCRを使用してすべての非同期IOを処理しました。スレッドのプールを使用して、要求が入ったときに要求を処理します。これはクライアントごとのスレッドではありませんが、シングルスレッドではなく、ユーザー数が増えるにつれて流動性を維持するために一般に数十のスレッドを必要とします。このアプローチは、複数のCPUコア間で簡単に拡張できることを意味します。CCRの非同期列挙子パターンは、非同期ロジックを適切に整理するのに非常に役立ち、1年後にはコードをかなり簡単に読み取ることができます。

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

于 2010-06-30T23:18:45.973 に答える