Использует ли CometD (Comet with Bayeux Protocol) потоковую передачу HTTP или длинный опрос HTTP?

Есть два метода реализации Comet. Один использует потоковую передачу HTTP, которая использует одно постоянное TCP-соединение для отправки и получения нескольких HTTP-запросов / ответов между клиентом / сервером. Второй - это длинный опрос HTTP, который поддерживает соединение открытым сервером, и, как только происходит событие , ответ фиксируется, и соединение закрывается. Затем новое соединение с длительным опросом немедленно повторно открывается клиентом, ожидающим прибытия новых событий.

Я использую рубиновый драгоценный камень Faye, и я заметил, что он использует Comet / Bayeux из коробки. Но я не могу понять, какой тип техники кометы он использует. Я просто понял, что Bayeux - это протокол публикации-подписки. Мне любопытно узнать, страдает ли он теми же недостатками, что и потоковая передача HTTP и длительный опрос. Разрешает ли он полнодуплексную связь (связь в обоих направлениях и, в отличие от полудуплекса, позволяет это происходить одновременно)?


person Donato    schedule 10.07.2015    source источник


Ответы (1)


Ваше определение потоковой передачи HTTP и длительного опроса неверно.

При потоковой передаче HTTP клиент отправляет запрос на сервер, и сервер отвечает «бесконечным» ответом, который содержит небольшие фрагменты данных (сообщения), обычно с использованием кодирования передачи фрагментов. Этот механизм стандартизирован как EventSource (также известный как события, отправленные сервером). Это передача событий только от сервера к клиенту. Чтобы клиент отправил на сервер другое сообщение, он должен открыть новое соединение.

При длинном опросе HTTP клиент отправляет запрос, который удерживается сервером до тех пор, пока не произойдет событие (или тайм-аут), затем ответ зафиксирован, но соединение не закрыто. Соединение остается открытым, и по нему могут отправляться другие запросы, как обычные, так и запросы с длительным опросом (разумеется, по одному).

протокол Байё - это протокол приложения поверх транспортного протокола, такого как HTTP или WebSocket. .

HTTP - это полнодуплексный протокол в контексте единого обмена запросом / ответом. Множественные HTTP-обмены сериализуются (то есть выполняются один за другим). HTTP-запрос / ответ обмен - это единица сериализации.

WebSocket - это полнодуплексный протокол в контексте сообщений WebSocket. Сообщения WebSocket можно отправлять и получать одновременно. Сообщение WebSocket - это единица сериализации.

Байё наследует характеристики транспортного протокола, если он продолжается. Сам протокол Байе не имеет никаких характеристик «дуплексности», вы можете думать о нем как о способе форматирования сообщений в определенной текстовой форме.

И CometD, и Фэй использовать Bayeux как для WebSocket, так и для длинного опроса HTTP.

person sbordet    schedule 10.07.2015
comment
Как Comet не вызывает сбой http-сервера, такого как apache2, с таким количеством открытых TCP-соединений, потребляющих память. Я имею в виду, что если у вас есть 64000 открытых TCP-соединений, каждое по 1 МБ, это только 64 ГБ памяти, что наверняка приведет к сбою большинства серверов. - person Donato; 10.07.2015
comment
Одно только TCP-соединение не потребляет 1 МБ памяти. Это поток, связанный с этим подключением, который потребляет этот MiB. Вот почему apache2 - неподходящий сервер для длительного опроса. Другие серверы, такие как Jetty (на котором работает CometD), nginx и т. д. могут поддерживать десятки тысяч соединений, не потребляя много памяти, поскольку в этом случае они используют асинхронный ввод-вывод и потоки более эффективным способом. Мне удалось подключить 400 000 клиентов CometD к одному серверу CometD / Jetty до того, как исчерпал лимит памяти. - person sbordet; 11.07.2015
comment
Спасибо за прекрасный отзыв. Я использовал apache2, но, прочитав ваши комментарии, это nginx. - person Donato; 11.07.2015