Разница между длинным опросом асинхронного сервлета и протоколом Bayeux (Comet)

В чем разница между простым асинхронным сервлетом и протоколом Comet/Bayeux?

Я пытаюсь реализовать веб-страницу типа «Server Push» (или «Reverse Ajax»), которая будет получать обновления с сервера по мере возникновения событий на сервере. Таким образом, даже если клиент явно не отправляет запрос, мне нужно, чтобы сервер мог отправлять ответы конкретному клиентскому браузеру.

Я понимаю, что Comet — это общий термин для такого рода технологий; с протоколом «Байе». Но когда я просмотрел спецификацию сервлета, кажется, что даже «асинхронный сервлет» выполняет то же самое. Я имею в виду, что могу определить простой сервлет с

<async-supported>

для атрибута установлено значение true в файле web.xml; и этот сервлет сможет асинхронно отправлять ответы клиенту. Затем у меня может быть ajax-клиент на основе jQuery или ExtJS, который просто продолжает выполнять

long_polling() 

вызов в сервлет. Что-то вроде того, что описано по ссылке ниже http://www.ibm.com/developerworks/web/library/wa-reverseajax1/index.html#long

Итак, мой вопрос заключается в следующем:

В чем разница между простым асинхронным сервлетом и протоколом Comet/Bayeux?

Спасибо


person Basanth Roy    schedule 10.01.2013    source источник


Ответы (1)


Это правда, что «Комета» — это термин для этих технологий, но протокол Байё используется лишь в нескольких реализациях. Техника Comet может использовать любой протокол, какой пожелает; Байё — один из них.

Сказав это, есть два основных различия между решением для асинхронных сервлетов и решением Comet+Bayeux.

Первое отличие состоит в том, что решение Comet+Bayeux не зависит от протокола, по которому передается Байе. В проекте CometD есть подключаемые транспорты как для клиентов, так и для серверов, которые могут передавать Байё. Вы можете передавать его с помощью HTTP, при этом Bayeux является содержимым запроса POST, но вы также можете передавать его с помощью WebSocket, при этом Bayeux является полезной нагрузкой сообщения WebSocket. Если вы используете асинхронные сервлеты, вы не можете использовать WebSocket, который намного эффективнее, чем HTTP.

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

Например, вы можете захотеть уникально идентифицировать клиентов, чтобы две вкладки для одной и той же страницы приводили к двум разным клиентам. Для этого вам нужно добавить «свойство» в запрос асинхронного сервлета, назовем его sessionId.

Затем вы хотите иметь возможность аутентифицировать клиента; только аутентифицированные клиенты могут получить sessionId. Но чтобы различать первые запросы на аутентификацию и другие последующие запросы, уже прошедшие аутентификацию, вам нужно другое свойство, скажем, messageType.

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

Далее вам нужны функции отключения. И так далее.

Вы быстро понимаете, что строите еще один протокол поверх HTTP.

На этом этапе лучше повторно использовать существующий протокол, такой как Bayeux, и проверенные решения, такие как CometD (который основан на методах Comet с использованием протокола Bayeux), которые дают вам:

  • Клиентские библиотеки Java и JavaScript с простыми, но мощными API
  • Библиотека сервера Java для выполнения логики вашего приложения без необходимости обработки низкоуровневых деталей, таких как HTTP или WebSocket, через аннотированные службы.
  • Возможность подключения транспорта, как клиента, так и сервера
  • Расширяемость протокола Байё
  • Ленивые сообщения
  • Кластеризация
  • Максимальная производительность
  • Доказательство будущего: пользователи CometD до появления WebSocket не меняли ни строчки кода, чтобы воспользоваться преимуществами WebSocket — вся магия была реализована в библиотеках
  • На основе стандартов
  • Разработано и поддерживается экспертами по веб-протоколам
  • Расширенная документация
  • Я могу продолжить, но суть вы поняли :)

Вы не хотите использовать низкоуровневое решение, которое связывает вас только с HTTP. Вы хотите использовать решение более высокого уровня, которое абстрагирует ваше приложение от используемого метода Comet и от протокола, который транспортирует Байе, чтобы ваше приложение можно было написать один раз и использовать будущие технологические усовершенствования. В качестве примера улучшения технологии CometD хорошо работал задолго до того, как появились асинхронные сервлеты, и теперь с асинхронным сервлетом просто стал более масштабируемым, и поэтому ваше приложение без необходимости изменять ни одну строку в приложении.

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

Ответ на ваш вопрос может быть таким: вы используете Comet+Bayeux, потому что хотите стоять на плече гигантов.

person sbordet    schedule 10.01.2013
comment
Ничего себе !! Спасибо за подробный ответ. Это ответило на большинство моих вопросов. Я оставлю этот вопрос открытым, чтобы увидеть, ответит ли кто-нибудь еще. Иначе я закрою это тогда. Еще раз спасибо. - person Basanth Roy; 11.01.2013
comment
Привет, Есть ли какой-нибудь клиентский код на основе Ext JS для CometD, на который вы можете мне указать? - person Basanth Roy; 15.01.2013
comment
Привет, нет, я думаю, что нет прямого примера с клиентом Ext JS с Cometd, но вы наверняка можете реализовать его, это очень просто, как я сделал это однажды. - person Vishal Zanzrukia; 03.12.2015