Уведомление клиента, я должен использовать AJAX Push или Poll? - PullRequest
33 голосов
/ 21 октября 2008

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

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

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

Спасибо за вашу помощь.

EDIT: Я рассмотрел простую версию AJAX Push и реализовал простую демонстрацию, основанную на этой статье Майка Первиса. Клиентская нагрузка довольно низкая - около 5 тыс. Для начальной версии, и ожидается, что она останется такой в ​​течение достаточно долгого времени.


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

Ответы [ 9 ]

12 голосов
/ 03 января 2013

Я удивлен, что никто здесь не упомянул длительный опрос. Длительный опрос означает сохранение открытого соединения в течение более длительного периода (скажем, 30-60 секунд), и после его закрытия снова откройте его и просто попросите сокет / соединение прослушивать ответы. Это приводит к меньшему количеству соединений (но более длинных) и означает, что ответы почти мгновенные (некоторым, возможно, придется ждать нового соединения для опроса). Я хотел бы добавить, что в сочетании с такими технологиями, как NodeJS, это дает очень эффективное и легкое в использовании решение, которое на 100% совместимо с браузерами во всех основных браузерах и версиях и не требует каких-либо дополнительных технологий, таких как Comet или Вспышка.

Я понимаю, что это старый вопрос, но подумал, что все же полезно предоставить эту информацию:)

10 голосов
/ 31 июля 2009

Определенно используйте толчок гораздо круче. Если вы просто хотите получать простые уведомления, я бы использовал что-то вроде StreamHub Push Server , чтобы сделать тяжелую работу за вас. Разработка собственной функциональности Ajax Push - чрезвычайно сложный и сложный путь - вы должны заставить его работать во всех браузерах, а затем обрабатывать брандмауэры и прокси-серверы, убивая соединения с поддержкой активности и т. Д. Зачем заново изобретать колесо. Кроме того, он имеет столь же низкую занимаемую площадь - менее 10 КБ, поэтому он должен подойти, если это является для вас приоритетом.

7 голосов
/ 21 октября 2008

Оба имеют разные требования и адрес разные сценарии.

Если вам нужно обновления в реальном времени , как в онлайн-чате, push - необходимость.

Но, если период обновления большой , как в вашем случае (5 минут), то пул является подходящим решением. В этом случае Push будет требовать много ресурсов как от клиента, так и от сервера.

Совет! попробуйте сделать страницу, которая проверяет пул, быстрой и чистой, чтобы она не потребляла много ресурсов на сервере при каждом запросе. Обычно я сохраняю в памяти флаг (например, в переменной сеанса), который говорит, если пул пуст или нет ... так что я хаваю смотреть в пул, только если он не пустой. Когда пул пуст, что происходит чаще всего, запрос страницы выполняется очень быстро.

5 голосов
/ 21 октября 2008

Поскольку использование push-уведомлений требует, чтобы между вашим сервером и каждым клиентом поддерживалось открытое HTTP-соединение, я бы тоже пошел на опрос - он не только потребует много ресурсов сервера, но и будет значительно более сложный для реализации, как уже упоминалось, Мэтт Б.

Мой опыт опроса состоит в том, что если у вас достаточно частый интервал опроса на достаточно загруженном сайте, журналы вашего веб-сервера могут быть заполнены запросами опроса очень быстро.

Редактировать (2017) : Я бы сказал, что ваш выбор сейчас между веб-сокетами и длинным опросом (упомянуто в другом ответе). Похоже, что длинный опрос может быть правильным выбором, поскольку в вопросе упоминается, что уведомления не нужно получать в режиме реального времени, а нечастый период опроса будет довольно легко реализовать и не должен сильно обременять ваш сервер. , Веб-сокеты - это круто и отличный выбор для многих приложений в наши дни, хотя в этом случае это может показаться излишним.

3 голосов
/ 21 октября 2008

Я бы реализовал опрос только потому, что это звучит проще, а его простота очень полезна.

1 голос
/ 05 августа 2011

Теперь есть сервис http://pusherapp.com, который пытается решить эту проблему раз и навсегда, в одно мгновение. Может стоит проверить. (отказ от ответственности: я никоим образом не связан с ними). ​​

1 голос
/ 21 октября 2008

Невозможно сказать, будет ли опрос дороже, чем подталкивание, не зная, сколько клиентов у вас будет. Я бы порекомендовал опрос, потому что:

  • Звучит так, будто вы хотите обновлять данные примерно раз в минуту. Если уведомления не могут получать гораздо более высокую скорость, чем нажатие, нажатие будет означать, что вы сохраняете HTTP-соединение открытым, но видите на нем очень мало активности.
  • Опрос построен на основе существующих соглашений HTTP, поэтому любой сервер, который обращается к веб-браузерам, уже готов отвечать на обычные запросы Ajax. Решение на основе Comet- или Flash-сокетов имеет различные требования; вам понадобится что-то вроде cometd на стороне сервера и библиотека на стороне клиента, которая подавляет push на стороне сервера.

Так что, если вам нужно что-то сверхпрочное для управления потоком данных и кучей клиентов, я бы порекомендовал Comet. Но, похоже, это не так.

1 голос
/ 21 октября 2008

Я сам не пробовал, но некоторые говорят, что COMET работает и проще, чем вы думаете . Есть также плагин Ruby on Rails под названием Juggernaut , о котором я слышал, о котором я много говорил. Опять же, я не использовал его, поэтому YMMV, но, насколько я понимаю, для этого требуется гораздо меньше ресурсов по сравнению с опросом. Я верю (кто-то может подтвердить?), Что COMET - это то, как MacRumorsLive.com обеспечивает ведение блогов в режиме реального времени на WWDC Stevenotes.

1 голос
/ 21 октября 2008

Не уверен, взглянули ли вы на некоторые реализации COMET (это то, что вы подразумеваете под AJAX push).

Если пользователь просматривает сайт, разве это не означает, что он запрашивает информацию с сервера, на которую может распространяться это уведомление?

...