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/