Почему веб-сайты прекращают вещание через некоторое время? (реализация использует ReactPHP, храповик и ZeroMQ)


У меня есть небольшой сервер websocket, работающий поверх набора библиотек:

  • ReactPHP,
  • Храповик

И

  • ZeroMQ, используя php-zmq обертка.

Код в основном такой же, как в учебных пособиях.

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

Использование совсем не подавляющее - на данный момент подключается только один или два разработчика интерфейсов, так как это этап разработки.

Цикл запущен, он возвращает протоколы переключения HTTP 101 при правильном подключении, но не передает сообщения, которые были правильно переданы ранее. Нигде никаких ошибок. Помогает перезапуск цикла событий.

Мои вопросы таковы:

1) Что может быть причиной этого? Кто-нибудь сталкивался подобное поведение?

2) Можете ли вы порекомендовать способ, которым я мог бы отладить это в длительном процессе цикла событий?

В настоящее время я должен остановить цикл, изменить код (добавить вызовы для ведения журнала), снова перезапустить цикл и подождать, пока он снова пойдет не так, что, по крайней мере, утомительно.

Любая помощь будет очень признательна.

Author: Finwe, 2017-02-08

1 answers

Ну, я думаю, что виновником был ZMQ.

Когда на одной машине было несколько приложений, использующих ZMQ, сообщения иногда попадали не к тому потребителю, даже если у каждого приложения был другой порт, указанный для подключения к сокетам ZMQ.

Таким образом, пользователи иногда получали кадры websocket из совершенно другого приложения, и когда для сообщения не было соответствующего пользователя, кадр исчезал по пути. Так что веб-сайты не останавливались вещание, сообщения были просто неправильно перенаправлены.

У меня нет больших знаний о ZMQ и о том, является ли это задокументированным или иным известным поведением.

Я решил проблему, переписав серверную часть в RabbitMQ с отдельным vhost и каналом для каждого приложения. Теперь проблемы исчезли, каждый кадр оказывается там, где должен быть.

 0
Author: Finwe, 2017-03-21 13:22:45