Короткий опрос или длинный опрос для веб-приложений в реальном времени?

Я создаю веб-приложение, работающее в реальном времени. Насколько мне известно, наиболее популярны варианты с коротким и длинным опросом. Какие преимущества и недостатки могут быть при измерении одного над другим?


person Jeff    schedule 09.01.2011    source источник
comment
@metrobalderas Длинные опросы здесь, только не в виде веб-сокетов. Вы по-прежнему можете использовать iframe / script / xhr и не позволять серверу закрывать соединение.   -  person Hemlock    schedule 10.01.2011
comment
@metrobalderas: комета Google ajax   -  person slebetman    schedule 17.01.2011
comment
Для всех, кто изучает эту тему, вот еще один вопрос по теме короткого или длительного опроса.   -  person blong    schedule 04.04.2013


Ответы (3)


  • Короткий опрос (он же таймер на основе AJAX):

    Плюсы: проще, без использования сервера (если время между запросами велико).
    Минусы: плохо, если вам нужно получать уведомление, КОГДА событие сервера происходит без задержки. Пример (на основе ItsNat)

  • Длинный опрос (он же Comet на основе XHR)

    Плюсы: вы получаете уведомление, КОГДА событие сервера происходит без задержки. Минусы: более сложный и задействованный больше серверных ресурсов. Пример (ItsNat на основе)

person jmarranz    schedule 17.01.2011
comment
В частности, при длительном опросе основным ограничивающим ресурсом сервера является максимальное количество открытых сокетов. Разные ОС имеют разные ограничения, но есть ограничения, которые намного ниже, чем доступная память. Короткий опрос позволяет обойти эту проблему, потому что каждое соединение открыто только в течение короткого периода времени, поэтому многие соединения могут быть мультиплексированы по времени. - person slebetman; 17.01.2011
comment
Длительный опрос не требует использования большего количества ресурсов, на самом деле он использует гораздо меньше. Соединение с незанятым сокетом в основном не использует никаких ресурсов, кроме пакетов поддержки активности (если они включены / настроены) и дескриптора открытого файла. - person Nepoxx; 04.12.2018
comment
Примеры больше не доступны. - person Diego Queiroz; 10.04.2021

Просто для аргументации.

Оба являются http-запросом (xhr), и, по крайней мере, частично неверно, он использует больше ресурсов сервера (полностью зависит от технологии, объясню позже).

Короткий опрос.

Много запросов, которые обрабатываются по мере поступления на сервер. Создает большой трафик (использует ресурсы, но освобождает их, как только будет отправлен ответ):

00:00:00 C-> Is the cake ready? 
00:00:01 S-> No, wait.
00:00:01 C-> Is the cake ready?
00:00:02 S-> No, wait.
00:00:02 C-> Is the cake ready? 
00:00:03 S-> Yes. Have some lad.
00:00:03 C-> Is the other cake ready? ..

Длительный опрос

Один запрос поступает на сервер, и клиент ожидает ответа (его не удалось решить). В случае сервера с php / apache это будет означать порожденный поток для обработки, который резервирует ресурсы до его завершения. Таким образом, трафик меньше, но вы быстро съедаете свои ресурсы (или, скорее, вы блокируете ресурсы). Но если вы используете, например, Node (или любой другой асинхронный подход - например, c ++ qt), вы потенциально можете значительно минимизировать использование ресурсов (сохранить объект ответа для HTTP-запроса и использовать его, когда работа будет готова)

12:00 00:00:00 C-> Is the cake ready? 
12:00 00:00:03 S-> Yes.Have some lad.
12:00 00:00:03 C-> Is the cake ready? 

Если вы сравните это с коротким опросом, вы увидите, что потенциально в коротком опросе вы использовали больше передач, но в течение этих 3 секунд вы фактически занимает 1,5 секунды времени обработки (это означает, что что-то может выполняться между вашими вызовами). В случае длительного опроса все время использовались одни и те же ресурсы. Сейчас обычно php со всеми библиотеками начинается с 4 МБ памяти - тогда у вас есть фреймворк 4-20 МБ. Предположим, вам доступно 1024 МБ ОЗУ (бесплатно). Скажем, давайте будем пессимистичны и предположим, что вы будете использовать 25 МБ на один php instace. Это означает, что вы можете получить не более 40 сценариев подключения с длинным опросом.

Это и есть причина, по которой вы потенциально можете обслуживать намного больше с помощью Node, поскольку node не будет порождать свои экземпляры (если вы не хотите использовать рабочих и т.д.), поэтому с той же памятью вы, вероятно, легко могли бы получить зависание 10k подключений. У вас будет всплеск ЦП, когда они появятся и когда они потенциально будут выпущены, но когда они простаивают, их как будто нет (вы платите только за структуры памяти, которые вы храните в node / c ++).

Websocket

Теперь, если вы хотите отправить несколько вещей, когда они находятся в клиенте или вне его, используйте веб-сокеты (протокол ws). Первый вызов - это размер http-запроса, но позже вы отправляете только сообщения от клиента к серверу (новые вопросы) и от сервера к клиенту (ответы или нажатия - может даже выполнять широковещательную рассылку для всех подключенных клиентов). Существуют библиотеки php websocekts, но, опять же, используйте другую технологию - предпочтительно node или c ++.

Некоторые библиотеки, такие как socket.io, имеют собственную иерархию, поэтому, когда websocket выходит из строя, он возвращается к длинному или короткому опросу.

Когда использовать.

Короткий опрос - ну никогда ^^.

Длительный опрос - возможно, когда вы обмениваетесь одним вызовом с сервером, а сервер выполняет некоторую работу в фоновом режиме. Также, когда вы больше не будете запрашивать сервер на той же странице. Также, когда вы не используете php в качестве уровня для обработки длинного опрашиваемого соединения (node ​​/ c ++ может быть простым средним уровнем). Обратите внимание, что длительный опрос может быть действительно полезным, но только тогда, когда вы это сделаете.

Websocket - вы потенциально можете обменяться более чем одним или двумя вызовами с сервером, или что-то может прийти с сервера, которого вы не ожидали / не просили, например, уведомление по электронной почте или что-то в этом роде. Вы должны планировать разные «комнаты», в зависимости от функциональности. Примите характер javascript, основанный на событиях;]

person sp3c1    schedule 28.01.2015
comment
Итак, по сути, длинный опрос - это постоянное соединение, которое может быть асинхронным открытым сокетом, тогда как короткий опрос обычно представляет собой постоянные запросы синхронного процесса? - person Joseph Persie III; 01.11.2015
comment
Это не является постоянным как таковое - это то, что вы не отправляете ответ прямо с сервера, и как только вы это делаете, он закрывается - другими словами, его ожидание (зависание). То же самое, что и с некоторыми длинными скриптами cron - они будут отправлять только данные, когда они будут готовы к браузеру через 10 минут. Принцип тот же - меняется простое использование. Так что это очень много синхронизации. Это также приводит вас ко второй проблеме с длинным опросом, о которой я не упоминал, - ограничениям браузера на количество открытых подключений (сейчас я думаю, что их около 8 - в браузерах нет ограничений для подключений через веб-сокеты). - person sp3c1; 02.11.2015
comment
Еще одним серьезным ограничением длительного опроса является блокировка сеанса, если вы не закроете сеанс или не используете неблокирующий диспетчер сеансов (например, db), файл сеанса для пользователя будет заблокирован и не будет принимать запросы от пользователя даже из другого браузера. окно. - person jvrnt; 14.12.2015
comment
Короткий опрос имеет место, например, в приложениях панели управления, из-за архитектурных и пользовательских преимуществ пакетных обновлений пользовательского интерфейса. - person nicodjimenez; 14.08.2017
comment
Что легче всего масштабировать? - person fatfrog; 23.02.2021

Если вы хотите получить приложение в реальном времени на основе базы данных, вы можете использовать комбинацию длинного опроса ajax и кометы. Длинный опрос действительно хорош для вашей пропускной способности, а также он действительно полезен для пользователя МБ, потому что, когда пользователь отправляет запрос, пользователь будет платить за него как МБ или какое-то подключение к Интернету. Например, для Короткий опрос, когда вы делаете что-то вроде отправки запроса в секунду, использование Интернета будет больше, потому что каждый пользователь соединения будет платить за него (это означает, что пользователь теряет Мб), но при длительном опросе пользователь будет платить только за новые сообщения .

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

person Ibrahim Hasanov    schedule 29.04.2016
comment
Многим людям следует обновить свои браузеры ... Веб-сокеты уже поддерживаются в IE11. Microsoft подталкивает всех к использованию Windows 10, и по умолчанию это означает Edge. Если вы не используете Opera Mini, но это ваша вина: P - person Manatax; 13.07.2016
comment
и вот почему вы должны использовать что-то вроде socket.io, который обрабатывает это за вас, когда веб-сокеты недоступны;] но кодовая база остается той же - person sp3c1; 19.07.2016
comment
@ sp3c1 Socket.io - кошмар масштабируемости. - person Hobbyist; 16.02.2017
comment
@Hobbyist как так? вы можете балансировать нагрузку, теперь вы также можете использовать сокет между разными процессами. Вы всегда можете вернуться к чистой реализации веб-сокета, но ядро ​​останется прежним. Что ж, вы можете реализовать сокет самостоятельно, но зачем изобретать колесо, если для веб-разработки это хороший стандарт? Если у вас есть проблемы с распределенной связью процессов, которые обрабатывают соединения сокетов, вы всегда можете изучить redis pub / sub. Настоящее преимущество socket.io перед websocket - это резервный протокол, который делает его более подходящим для старых браузеров. - person sp3c1; 22.02.2017
comment
@ sp3c1 Я рад это слышать, смогу ли я использовать socket.io в общем хостинге? потому что у websocket есть недостаток, например, он не работает на планах общего хостинга - person Ibrahim Hasanov; 28.02.2017
comment
многие вещи не работают на виртуальном хостинге;] Вы можете без проблем загрузить балансировку веб-сокетов в целом. - person sp3c1; 01.03.2017
comment
@ sp3c1 какой хостинг мне нужен для использования Websocket? VPS? - person Ibrahim Hasanov; 07.03.2017
comment
все, что действительно дает вам доступ к консоли. Лично я использую Linode в личных целях (20 долларов в месяц за коробку с 4 ядрами). Есть другие провайдеры с похожими ценами тыс. - person sp3c1; 07.03.2017