Статьи

Cometd Подтвержденное расширение сообщения

С выпуском последней Cometd- Jetty в Jetty 6.1.15 , часто запрашиваемая функция надежной доставки сообщений теперь поддерживается расширением Acknowledged Message Extension на сервере Jetty и в клиентах dojo и jquery.

Первоначальная концепция Cometd заключалась в обеспечении связи между сервером и браузером в «веб-качестве», т.е. она не была предназначена для обеспечения надежной, транзакционной и / или атомарной доставки сообщений. Предполагалось, что если ваша сеть выйдет из строя, сообщения могут быть потеряны. Хотя этого достаточно для многих приложений, этого недостаточно для многих других. К счастью, протокол Bayeux, реализованный cometd, предусматривает механизм расширения, который теперь используют cometd-jetty, cometd-dojox и cometd-jquery, чтобы обеспечить признанный механизм сообщений для надежной доставки сообщений.

Серверная сторона

Чтобы включить поддержку cometd-jetty для подтвержденных сообщений, необходимо добавить расширение к экземпляру bayeux во время инициализации:

  
bayeux.addExtension(new AcknowledgedMessagesExtension());

AcknowledgedMessageExtension — это расширение для каждого сервера, которое отслеживает рукопожатия от новых клиентов, проверяя, поддерживают ли они также подтвержденное расширение сообщения, а затем добавляет AcknowledgedMessagesClientExtension каждому клиенту при рукопожатии.

После добавления к клиенту AcknowledgedMessagesClientExtension предотвращает доставку сообщений по любому запросу, кроме / meta / connect, чтобы предотвратить возможность неупорядоченной доставки. Расширение также поддерживает список неупакованных сообщений и перехватывает трафик / meta / connect для вставки и проверки идентификаторов подтверждения.

Dojox Client

Клиентская часть для dojo предоставляется dojox / cometd / ack.js, который был выпущен в dojo 1.3.0b2 (но также может быть применен к dojo 1.2.x). Для включения клиентской части используется механизм dojo required:


dojo.require("dojox.cometd.ack");

Этого достаточно для включения расширения, однако затем его можно программно отключить / включить перед инициализацией, установив логическое поле ackEnabled:


dojox.cometd.ackEnabled = (dojo.query("#ackInit").attr("checked") == "true");
dojox.cometd.init(cometdUrl);

JQuery Client

Клиентская сторона для jquery включена путем включения файла jquery.cometd-ack.js (в комплекте с Jetty 6.1.15):

  
<script type="text/javascript" src="../../jquery/jquery.cometd.js"></script>

подробности

Чтобы включить подтверждение сообщения, и клиент, и сервер должны указать, что они поддерживают подтверждение сообщения. Об этом договариваются во время рукопожатия. При рукопожатии клиент отправляет «ext»: {«ack»: «true»}, чтобы указать, что он поддерживает подтверждение сообщения. Если сервер также поддерживает подтверждение сообщения, он также отвечает «ext»: {«ack»: «true»}.

Расширение не вставляет идентификаторы подтверждения в каждое сообщение, так как это налагает значительную нагрузку на сервер для сообщений, отправляемых нескольким клиентам (которые должны быть повторно идентифицированы в json для каждого клиента). Вместо этого идентификатор ack вставляется в поле ext сообщений / meta / connect, связанных с доставкой сообщений. Каждый запрос / meta / connect содержит идентификатор подтверждения последнего полученного ответа подтверждения: «ext»: {«ack»: 42}. Точно так же каждый ответ ack содержит идентификатор ext ack, который однозначно идентифицирует пакет отправленных ответов.

Если сообщение / meta / connect получено с ackId ниже, чем любые неподтвержденные сообщения, удерживаемые расширением, то эти сообщения помещаются в очередь перед любыми более недавно помещенными в очередь сообщениями и ответом / meta / connect, отправляемым с новым идентификатором подтверждения.

демонстрация

Есть пример подтвержденных сообщений в демо-версии чата dojox, поставляемой в комплекте с cometd-jetty.

Чтобы запустить демонстрацию, загрузите реализацию Cometd для Jetty, а затем:


cd contrib/cometd/demo
mvn jetty:run

Укажите в браузере адрес http: // localhost: 8080 / examples / chat / и обязательно установите флажок «Включить надежный обмен сообщениями?».

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

Обратите внимание, что если отключенный браузер отключен из-за превышения maxInterval (по умолчанию 10 с), то время ожидания клиента истечет, а неподтвержденная очередь будет удалена.

С http://blogs.webtide.com/