Команда Push and Pull не доходит до браузера - разбор причин
Сервер положил команду в очередь, а на странице ничего не произошло. Разбираем причины по убыванию частоты, начиная с проверки клиента.
С чего начать
Смотрим, появилась ли на странице клиентская библиотека:
console.log(typeof BX.PULL); // "undefined" означает: библиотека не подключенаconsole.log(BX.PULL && typeof BX.PULL.subscribe); // метода подписки быть обязаноОтвет «не определено» снимает половину версий сразу: серверная часть тут ни при чём, команда просто некому доставить. Библиотеку подключают расширением, а не ручным подключением файла из ядра.
Подключаем клиентскую библиотеку в публичной части:
\Bitrix\Main\UI\Extension::load('pull.client'); // в мобильном веб - своё расширение// без этой строки объект BX.PULL на странице не появится вовсеСлушаем все команды своего модуля потоковым обработчиком:
BX.PULL.subscribe({ moduleId: 'vendorshop', // имя модуля-отправителя callback: (data) => console.log(data.command, data.params),});// в консоли видно, какие команды реально приходят и как они называютсяПотоковый обработчик отвечает на главный вопрос разбора: команда не пришла вовсе или пришла с другим именем. Подписка на одну команду такой разницы не показывает и выглядит одинаково в обоих случаях.
Проверяем отправку на стороне сервера:
if (!\Bitrix\Main\Loader::includeModule('pull')) { throw new \RuntimeException('модуль очередей не установлен');}\CPullStack::AddByUser($userId, [ 'module_id' => 'vendorshop', 'command' => 'orderStatus', 'params' => ['id' => $orderId, 'status' => 'F'],]);Отправка без подключённого модуля не поднимает ошибку и выглядит как успешная. Проверка результата подключения превращает молчаливый сбой в понятное исключение на первой же строке кода.
Выдаём гостю его собственный канал:
// пролог сайта, до вывода страницыdefine('PULL_USER_ID', -$guestId); // уникальное отрицательное число на гостя// без своего номера гости попадают в общий канал и команды смешиваютсяПричины
-
Клиентская библиотека не подключена примерно 25% случаев
ПризнакВ консоли браузера объект подписки не определён, ошибок при этом нет.
ПроверкаПечатаем тип объекта подписки в консоли на той странице, где ждём команду.
Что делатьПодключаем клиентское расширение модуля очередей в шаблоне или компоненте страницы.
-
Модуль очередей не подключён перед отправкой примерно 20% случаев
ПризнакСерверный код отрабатывает без ошибок, но команда до очереди не доходит.
ПроверкаСмотрим результат подключения модуля прямо перед вызовом отправки команды.
Что делатьПодключаем модуль и прерываем работу, если он недоступен: молчаливый сбой хуже исключения.
-
Имена модуля или команды не совпадают примерно 20% случаев
ПризнакКоманда уходит с сервера, а обработчик на клиенте не вызывается ни разу.
ПроверкаПодписываемся на все команды своего модуля и печатаем их имена в консоли.
Что делатьПриводим имя модуля и команды к одному написанию на сервере и на клиенте.
-
Гостю не выдан собственный канал примерно 15% случаев
ПризнакАвторизованные получают команды, а неавторизованные посетители - нет или чужие.
ПроверкаПроверяем, задаётся ли гостю уникальный отрицательный номер в прологе страницы.
Что делатьПрисваиваем каждому гостю стабильный отрицательный номер и кладём его в константу пролога.
-
Редакция или версия не поддерживают гостевой режим примерно 10% случаев
ПризнакГостевые каналы не работают ни на одной странице, у авторизованных всё хорошо.
ПроверкаСмотрим редакцию и версию продукта на странице обновлений административного раздела.
Что делатьПереходим на редакцию с поддержкой гостевого режима либо доставляем данные запросом с клиента.
-
Ключ подписи не совпадает с сервером очередей примерно 10% случаев
ПризнакСоединение устанавливается, но ни одна команда не доходит до браузера.
ПроверкаСверяем ключ подписи в настройках сайта с ключом самого сервера очередей.
Что делатьПриводим ключи к одному значению и перезапускаем сервер очередей после правки.
Частые вопросы
Почему команда приходит с задержкой в минуту?
Сайт работает в режиме опроса, без постоянного соединения с сервером очередей. Интервал опроса и даёт эту задержку, а постоянное соединение доставляет команду сразу.
Можно ли отправить команду всем посетителям сразу?
Штатно команды адресуют пользователю или подписчикам тега. Массовую рассылку собирают перебором получателей или подпиской на общий тег.
Устарел ли глобальный обработчик событий?
Да, в новом коде подписываются через метод подписки клиентской библиотеки. Глобальный обработчик встречается в старом коде и постепенно уходит.
Как проверить сам сервер очередей?
Пунктом меню веб-окружения и журналом сервера очередей. Если соединение не устанавливается, разбор начинают с инфраструктуры, а не с кода.
Работает ли механизм на нескольких вкладках?
Да, каждая вкладка получает команды своего канала. Для согласования вкладок между собой у библиотеки есть отдельные средства.
Смежное
- Мгновенные сообщения на страницу - оглавление подтемы
- Push and Pull: настройка сервера очередей и проверка - настройка инфраструктуры
- Сообщения на страницу без перезагрузки - как это работает в норме
- Расширение не подключается: разбор причин - почему библиотека не появилась на странице
- Мгновенные сообщения и push - устройство механизма целиком
- Отладка на боевом сайте: журналы, режим ошибок, поиск виновника - инструменты разбора
- Pull изнутри: канал, подписка, доставка до браузера - где в цепочке рвётся доставка