2010-06-25 7 views
2

Я понимаю, что для длинного опроса AJAX считается плохим дизайном использовать обычный, многопоточный веб-сервер (например, Apache) ... но я не действительно понимаю, почему.Зачем нужен цикл событий для асинхронных запросов (например, длинный опрос AJAX)

Это потому, что каждый запрос на длительный вызов занимает значительно больше времени, чем обычный (таким образом, связывание процессора)? И если это так, действительно ли потоки действительно занимают столько накладных расходов, что они не могут оставаться без дела на некоторое время перед использованием?

ответ

7

Чтобы уточнить, опрос AJAX - это когда клиентский javascript делает запрос AJAX, который не выполняется немедленно. Вместо этого сервер ждет, пока он не захочет нажать ответ клиенту, а затем использует уже открытый контекст AJAX для этого. (справа?)

На веб-сервере, который обрабатывает каждое соединение своим собственным потоком, это открытое соединение будет создавать один поток для каждого клиента на веб-сайте. Поток будет работать до тех пор, пока клиент не закроет соединение. Когда я говорю «бег», это просто означает, что поток существует и занимает серверные ресурсы; он может работать на холостом ходу в функции sleep() или wait(). Но он по-прежнему потребляет гораздо больше системных ресурсов, чем будет использоваться на сервере, основанном на событиях.

+0

+1 - для определения длинных опросов. :) –

1

Это не значит, что вы связываете процессор, но блокируете соединение и поток пула потоков. Затем сервер должен быть настроен с гораздо большим пулом потоков.

Если ваше приложение пытается конкурировать с facebook, то у вас есть серьезная проблема на ваших руках, если это внутреннее приложение в SME для заказа обеда, никто не пострадает.

0

На самом деле это не проблема с вырезом и сушкой, поскольку он имеет различные факторы, которые могут повлиять на ответ.

Например, вы используете рыскания (веб-сервер, написанный в Эрланге)? Тогда это не будет проблемой, за исключением того, что вы связываете порты на веб-сервере, но потоки не являются проблемой.

Вы используете API Java NewIO, поэтому для каждого соединения не требуется выделенный поток, то это не будет проблемой для потоков.

Но если вы связываете ненужные ресурсы независимо от того, что вы делаете, то это плохо. Например, если вы держите соединение с базой данных открытым, выполните некоторую крупную обработку, а затем напишите обратно, что также плохой дизайн.

Храните ресурсы только до тех пор, пока они вам понадобятся.

Если вы собираетесь выполнить некоторую обработку, которая занимает значительное количество времени, тогда вы можете захотеть взглянуть на более асинхронное решение.

Например, укажите уникальный номер, который пользователь может использовать, чтобы проверить, выполнен ли их запрос, чтобы они могли закрыть свой компьютер или просто проверить его, когда захотят, не беспокоясь о потере чего-либо.