Модуль Push and Pull позволяет организовать транспорт для отправки мгновенных команд. Реализация данного функционала в виде отдельного модуля позволяет любому другому модулю (в том числе и модулям сторонних разработчиков) используя API отправлять мгновенные нотификации и сообщения клиентам.

Работа этого модуля требуется для обеспечения полной функциональности модулей Мобильные приложения, Блоги и Веб-мессенджер.

Модуль использует технологии:

Pull (англ. long-polling, англ. simple pull) - технология сетевой коммуникации, при которой первоначальный запрос данных производится клиентом, а ответ порождается сервером.

Технология Pull — эффективный и экономичный способ для открытого вещания широкому кругу неизвестных потенциальных клиентов. Он наиболее эффективен для клиента, ищущего специфический элемент. Pull-запросы составляют базовую основу сетевых вычислений, когда множество клиентов запрашивают данные с централизованых серверов. Так же, pull широко используется в сети Интернет для HTTP-запросов страниц на web-сайтах.

Противоположностью ей является технология Push.

Push (англ. Push, дословно — «продавливание» или «продвижение»), (также известен как webcasting или netcasting) - один из вариантов распространения контента в Интернете, когда информация поступает от сервера к клиенту на основе ряда параметров, установленных клиентом.

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

Примечание: Если при просмотре ленты у пользователя вместо правильного текста появляются нечитаемые символы, то скорее всего в браузере жестко указана какая-либо кодировка. Необходимо указать автоматический выбор кодировки (Вид > Кодировка > Авто).

Как работает Push and Pull

На серверной стороне поддержка мгновенных сообщений осуществляется модулем NGINX: nginx-push-stream-module. Данный модуль обеспечивает поддержку long-polling соединений с клиентами и доставку опубликованных им сообщений.

Примечание: Bitrix Framework и без модуля nginx-push-stream-module> обеспечивает достаточно высокую скорость передачи сообщений: 60 секунд интервал, при наличии сообщений интервал между соединениями уменьшается до 10 секунд.

При открытии страницы клиент ajax-запросом, подключается к своему каналу на одном из портов NGINX: 8893 (http) или 8894 (https). (В случае использования виртуальной машины BitrixVM. При использовании собственной конфигурации сервера администратор волен использовать любые удобные ему порты.) С данного порта NGINX перенаправляет пользователя на внутренний сервер очередей (доступный только по 127.0.0.1:8895), где проверятся наличие канала пользователя и новых сообщений. В случае если в канале нет сообщений, сервер не отдает ответ, а держит соединение в течение 40 сек.

Если в течение этого времени в канал пользователя придет новое сообщение, то сервер отправит его клиенту и закроет соединение. В случае если в канал пользователя не будет новых сообщений в течение 40 секунд, то сервер разорвет соединение и отправит ему заголовок: 304 Not Modified.

После получения ответа сервера и закрытия соединения клиент выполнит повторное подключение к каналу с новой датой последнего изменения.

Сообщения в канал пользователя публикуются посредством вызова соответствующих методов API модуля Push and Pull.

Для работы с мгновенными сообщениями рекомендуем использовать протокол https.

Примечание: Большое значение имеет правильная синхронизация времени сервера с глобальными серверами.

Настройка модуля

При использовании продуктов Bitrix Framework на базе виртуальной машины BitrixVM либо BitrixEnvironment с v. 5.0 необходимости в настройке модуля нет: всё работает "из коробки". Если проект используется не на штатных средствах установки Bitrix Framework, то необходимо произвести дополнительные настройки.

Примечание: Приведённые ниже образцы настроек даны для примера. Настройку под конкретный проект, при отказе от использования рекомендуемых BitrixVM или BitrixEnvironment, администратор должен произвести самостоятельно.

Внимание! Работа модуля Push and Pull поддерживается только до версии 0.5 nginx-push-stream-module. Более свежии версии не поддерживаются, так как для работы Push and Pull разрабатывается специальное решение от "1С-Битрикс".

  • Соберите NGINX с поддержкой модуля nginx-push-stream-module;

    В качестве примеров можно использовать файлы из нашей виртуальной машины:

    • /etc/nginx/bx/site_enabled/push.conf - настройки push and pull для публикации сообщений, а так же для работы мобильных;
    • /etc/nginx/bx/conf/im_subscrider.conf - настройки для получения сообщений (они подключаются к сайту непосредственно);
    • /etc/nginx/bx/conf/im_settings.conf - количество каналов, объём памяти и т.п..

    Настройка nginx-push-stream-module в версии 0.4.0 (рекомендуется к использованию)

    Настройка nginx-push-stream-module в версии 0.3.4

  • Включите в настройках продукта на странице Настройки > Настройки продукта > Настройки модулей > Push and Pull опцию На сервере установлен модуль nginx-push-stream-module:

    Так же необходимо выбрать версию используемой вами машины. Рекомендуется использовать Виртуальную машину в версии 4.4 и выше, так как в ней используется более совершенная версия модуля nginx-push-stream-module 0.4.0, позволяющая использовать технологию Веб-сокетов и отправление команд.

  • При заполнении поля Максимальное кол-во отправленных команд за одно подключение к серверу учтите, что его значение зависит от настройки large_client_header_buffers сервера NGINX. Значение этой настройки в 8 kb соответствует возможности отправить 100 команд. Зависимость этого значения и числа команд - прямо пропорциональная: если нужно отправить, например 200 команд за одно соединение, то в large_client_header_buffers сервера NGINX должно стоять 16 kb.

    Большое число значений поля Максимальное кол-во отправленных команд за одно подключение к серверу нужно при большом среднем числе получателей сообщений. Зависимость от общего числа пользователей корпоративного портала здесь прямая, но пропорциональность устанавливать надо опытным путём конкретно для вашего случая. Если технические возможности позволяют, то можно не рассчитывать пропорциональность, а установить значение поля "с запасом": на 150 пользователей портала использовать 100 команд, на 300 - 200 команд и так далее.

  • При необходимости перенастройте шаблоны путей. Домен в адресе для чтения сообщений можно указать #DOMAIN#: такая нотация будет автоматически заменяться под нужный домен для многодоменных конфигураций. Пример: http://#DOMAIN#:8893/bitrix/sub/.

    Примечание: Если используется Виртуальная машина, либо настройка nginx-push-stream-module производилась по аналогии с BitrixEnvironment, то изменения путей не требуется.

  • При использовании мобильных устройств включите поле Отправлять PUSH уведомления на мобильные телефоны.
  • Если в системе несколько активных сайтов, то есть возможность выбрать на каких сайтах модуль не будет работать.

Примечание: С версии 14.1.2 добавлена поддержка WebSocket, для активации опции необходима поддержка опции на "Сервере очередей".

Внимание! Если у вас появляется ошибка вида:
XMLHttpRequest cannot load 
http://example.com:8893/bitrix/sub/?CHANNEL_ID=<уникальный_адрес_канала>&tag=1&rnd=1380619831146. 
Origin http://example.com is not allowed by Access-Control-Allow-Origin.
то, значит вы используете версию модуля nginx push stream module до 0.3.4.

Необходимо: либо обновить версию модуля, либо закомментировать строки:

add_header "Access-Control-Allow-Origin" "*";
add_header "Access-Control-Allow-Headers" "if-modified-since, origin, if-none-match";

Дополнительная информация



22