AJAXのロングポーリングに通常のスレッド化されたWebサーバー(Apacheなど)を使用することは悪い設計と見なされていることは理解していますが、その理由はよくわかりません。
これは、各ロングポーリング要求が通常の要求よりも大幅に時間がかかるためですか(したがって、プロセッサが拘束されます)?その場合、スレッドは実際に、使用する前にしばらくアイドル状態を維持できないほどのオーバーヘッドを消費しますか?
AJAXのロングポーリングに通常のスレッド化されたWebサーバー(Apacheなど)を使用することは悪い設計と見なされていることは理解していますが、その理由はよくわかりません。
これは、各ロングポーリング要求が通常の要求よりも大幅に時間がかかるためですか(したがって、プロセッサが拘束されます)?その場合、スレッドは実際に、使用する前にしばらくアイドル状態を維持できないほどのオーバーヘッドを消費しますか?
明確にするために、AJAXポーリングは、クライアント側のjavascriptがすぐに実行されないAJAX要求を行う場合です。代わりに、サーバーはクライアントに応答をプッシュするまで待機し、すでに開いているAJAXコンテキストを使用してプッシュします。(右?)
各接続を独自のスレッドで処理するWebサーバーでは、その開いている接続により、Webサイト上のクライアントごとに1つのスレッドが作成されます。クライアントが接続を閉じるまで、スレッドは実行され続けます。「実行中」とは、スレッドが存在し、サーバーリソースを使用していることを意味します。sleep()またはwait()関数でアイドリングしている可能性があります。ただし、イベントベースのサーバーで使用されるよりもはるかに多くのシステムリソースを消費します。
プロセッサを拘束しているわけではありませんが、接続とスレッドプールのスレッドをブロックしています。次に、サーバーははるかに大きなスレッドプールで構成する必要があります。
あなたのアプリケーションがFacebookに匹敵しようとすると、あなたの手に大きな問題があります。それが昼食を注文するための中小企業の内部アプリケーションである場合、誰も怪我をすることはありません。
答えに影響を与える可能性のあるさまざまな要因があるため、これは実際には単純な質問ではありません。
たとえば、yaws(Erlangで記述されたWebサーバー)を使用していますか?そうすれば、Webサーバーのポートを拘束していることを除いて、実際には問題にはなりませんが、スレッドは問題ではありません。
Java NewIO APIを使用しているので、各接続は専用のスレッドを使用しないため、スレッドの問題にはなりません。
しかし、何をしていても、リソースを不必要に拘束しているのであれば、それは悪いことです。たとえば、データベース接続を開いたままにして、いくつかの主要な処理を行ってから書き戻す場合、これも悪い設計です。
リソースは、必要な期間だけ保持してください。
かなりの時間がかかる処理を行う場合は、より非同期のソリューションを検討することをお勧めします。
たとえば、ユーザーがリクエストが完了したかどうかを確認するために使用できる一意の番号を指定して、ユーザーがコンピューターをシャットダウンしたり、何も失うことを心配せずにいつでも確認できるようにします。