NodeJS & Socket.IO

У меня возникает странная проблема при использовании NodeJS и Socket.io.

Сервер, который получает данные через ZeroMQ. Это работает отлично. Для каждого сообщения из ZeroMQ я использовал sockets.volatile.emit для отправки всем подключенным клиентам. Проблема возникает только для большого количества подключенных учетных записей (более 100), кажется, что есть очередь на отправку клиентам (сообщение о получении клиента в задержке, которое продолжает увеличиваться)

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

Через Logs/Debug я знаю, что получение от ZeroMQ не имеет задержки, и все работает в этой части. Кажется, что излучение имеет очередь или задержку, которая продолжает увеличиваться.

Скорость сообщений 80 сообщений/сек для каждого клиента.

Note: NodeJS 0.10.20 и Socket.IO 0.9.16.

Как я могу контролировать это, чтобы предотвратить получение старых сообщений клиентом?

Ответ 1

Оформить заказ article, он расскажет вам об основных ошибках и о блокировке события который кажется довольно похожим на то, что вы делаете.

Возможно, используйте такие инструменты, как: Отладка и Заблокировано Я думаю, это поможет решить проблему. И для отладки, когда вы создаете узкое место по производительности и другие основные проблемы.

Альтернативно подключите проект node вверх по PM2 и привяжите его к Keymetrics.IO это даст вам хорошее представление о вашем сервере и почему оно работает медленно и почему вы делаете узкое место в производительности.

Сложно решить вашу проблему без примеров кода, но здесь есть 3 причины, по которым ваше приложение или вы можете создавать узкие места (возможно, неосознанно):

  • Разбор большой полезной нагрузки json с помощью функции JSON.parse.

  • Попытка сделать подсветку синтаксиса в большом файле на бэкэнд (с чем-то вроде Ace или highlight.js).

  • Разбор большого вывода за один раз (например, вывод команды журнала git из дочернего процесса).

Дополнительная информация в первом статье в разделе 2, называемом "Блокировка цикла событий"

Вопрос, связанный с вашим, этот.

Хотите узнать больше о цикле событий, я могу горячо направить вас на протектор "Как работает одиночная неблокирующая IO-модель в Node.js"

Вот модель модели обработки Node.js, чтобы увидеть, что происходит в цикле событий и его окружении

Node.js processing model

Ответ 2

Если окажется, что вы не блокируете цикл событий каким-либо ужасным образом, вы можете столкнуться с ограничениями на то, что socket.io может обрабатывать для вашего конкретного приложения. Если это так, то вы можете рассмотреть возможность расширения ваших экземпляров.

Ознакомьтесь с этой статьей для получения дополнительной информации: http://drewww.github.io/socket.io-benchmarking/