Servlet 3.0 и Comet / long-polling: что происходит в этих конкретных сценариях - PullRequest
0 голосов
/ 29 апреля 2011

Я взглянул на краткий обзор реализации серверного push-запроса Servlet 3.0 здесь и оставил больше вопросов, чем я пришел.Вопросы касаются моего варианта использования: внедрение динамической системы уведомлений среди «друзей», как в Facebook.Концептуально думая о проблеме, я бы подошел к ней так:

  1. Поместить бесконечный цикл jQuery на каждую страницу, содержащую код для выдачи XMLHttpRequest-запроса "get" на сервер
  2. Разрешить серверу сохранять объекты запроса / ответа, относящиеся к этому типу XMLHttpRequests, в карте области приложения (с помощью AsyncContext и .startAsync ()), используя ключ веб-сайта пользователя
  3. Каждый раз, когда пользовательучаствует в действии, которое порождает уведомление, запрашивает карту области приложения для идентификаторов друзей пользователя и, используя хранящиеся там объекты ответа, отправляет уведомление каждому другу.
  4. Каждый из друзей получает уведомление,и бесконечный цикл на страницах, где они находятся, снова вызывает XMLHttpRequests (из-за бесконечного цикла)

Предполагается, что моя система концептуально исправна (и если это не так, скажите, пожалуйста, что не так)Есть несколько проблем, которые я вижу с этой системой:

  1. Что счастливсоответствует ли пара запрос / ответ на карте после использования ответа?Я должен вручную удалить его с карты или подождать, пока цикл на стороне клиента отправит другой запрос, чтобы пара сохраненных объектов запрос / ответ могла быть заменена парой, связанной с новым XMLHttpRequest?Приведенная выше ссылка использует слова «зафиксированный» и «незафиксированный» в отношении объектов ответа.Может кто-нибудь объяснить, что означают эти слова в этом контексте (у меня есть ощущение, что они связаны с долговечностью объектов ответа)?

  2. Что произойдет, если двое или более друзей пользователяучаствовать в действиях, которые вызывают уведомления в то же время?Для каждого пользователя хранится только одна пара запрос / ответ.В зависимости от того, какое действие совершает друг, он обнаруживает, что соответствующая пара запросов / ответов пользователя получает уведомление, отправленное этому пользователю, но как быть с действиями других друзей?Если все они происходят одновременно, то другие действия не будут иметь пару запрос / ответ, которую можно использовать для отправки уведомления, пока пользователь не отправит еще один запрос XMLHttpRequest для сохранения на карте.Предположительно другие действия проанализируют карту и либо не найдут запись для этого пользователя (поскольку она была удалена вручную после того, как другое действие использовало ответ), либо найдут «устаревший» объект запроса / ответа, который уже использовался.Я предполагаю, что объект ответа не может быть использован для двух разных ответов, так как бы кто-то пошел на исправление этого?

  3. Что произойдет, если уведомление отправлено пользователю, когдапользователь переключает страницы?Если мы рассматриваем полностью загруженную веб-страницу как открытое окно для получения запросов на уведомление, а загрузочную - как закрытое окно (поскольку она не может получать и обрабатывать ответы на запросы XMLHttpReRek, отправленные на предыдущей странице), уведомления, отправленные во время этогосроки будут потеряны.Могу ли я что-нибудь сделать, кроме запроса базы данных о новых действиях и создания уведомлений таким образом при загрузке страницы?

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

Извините, если это было длительное чтение.Даже если вы сможете ответить только на один из приведенных выше вопросов, это поможет!

1 Ответ

1 голос
/ 29 апреля 2011
  1. Ответ сохраняется до тех пор, пока не истечет время ожидания. Вы продолжаете выдвигать на него новую информацию снова и снова. Вот что такое комета. Вы не зацикливаете запросы на получение навсегда, вы обрабатываете данные, которые передаются с сервера по мере поступления, 1 запрос на получение будет длиться до истечения времени ожидания, затем в полной функции выдайте еще один get.

  2. Опять же, ответ все еще доступен, вы только пишете на нем, а не закрываете его каждый раз.

  3. Одним из способов является отметка времени всех уведомлений и загрузка страницы данными за определенное время, затем ваш первоначальный запрос на получение предоставляет отметку времени, и вы обновляетесь.

  4. Полагаю, вы снова держите его до истечения времени ожидания.

Так что просто чтобы лучше объяснить, что здесь происходит,

  • Ваша страница загружена и отправляет запрос на получение.
  • Запрос / ответ хранится на карте.
  • Каждое обновление затем отправляется по ЖЕ паре запрос / ответ.
  • Ваш запрос на получение прослушивает readystate === 3 (данные получены) и считывает данные, получая все новое, что было отправлено.
  • Когда они тайм-аут / отправили определенное количество данных / все, что они удаляются.
...