Сколько событий может обработать socket.io? - PullRequest
0 голосов
/ 15 ноября 2018

Я пробовал Socket.io (сервер и клиент) для моего личного проекта. Поскольку это моя первая попытка с node.js, даже с javascript и mongodb, я немного озадачен производительностью моего сервера.

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

Например -

  • Номер R1 >> Событие R1E1, Событие R1E2, Событие R1E3 .... Событие R1EN

  • Номер R2 >> Событие R2E1, Событие R2E2, Событие R2E3 .... Событие R2EN

Все данные хранятся в mongodb. Работает потрясающе.

Но проблема возникает, когда несколько клиентов (5-8) с 10-15 зарегистрированными событиями начинают отправку данных. Сервер изначально работает нормально, но через пару минут перестает отвечать. Клиенты остаются на связи, даже если сервер не отвечает. Запросы накапливаются. Когда-нибудь сервер получит запрос последнего сеанса.

Все начинается, когда конечное устройство начинает регистрировать события. Итак, я хочу знать, сколько событий может обработать socket.io?

P.S. Вот что я думаю, что "событие" -

io.on('event', function(msg){
    console.log( msg);
});

Редактировать 2

Как я изучал в файле node.js, узел - это, по сути, процесс, который выполняется в одном потоке, если он требует обработки других вещей, он запускает другой узел (асинхронный поток), оставляет новый поток в покое, выполняя свой процесс и возвращая на основной поток работает. Если мы хотим обработать некоторые последовательности процесса, мы используем «async / await».

В моем случае я использую async только в одном месте, когда клиент впервые подключается. Здесь я запрашиваю 3 разные коллекции mongodb и возвращаю данные о событии.

Мой сервер в настоящее время работает на MacBook Pro (16 ГБ ОЗУ, четырехъядерный процессор i7 6-го поколения). Он должен обрабатывать как минимум 4-6 параллельных потоков.

Я создал нагрузочный тест, 100000 различных событий распределены по 1000 комнатам с 5 запросами в секунду, запрашивая дБ. Работало нормально. Максимальная загрузка - почти 40% ОЗУ и 250% - ЦП.

Мое соединение с БД является постоянным, что означает, что я подключаюсь к БД, как только сервер запускается, и поддерживаю эту ссылку на соединение.

Так в чем же проблема?

1 Ответ

0 голосов
/ 15 ноября 2018

Итак, я просто хочу узнать, сколько событий может обработать socket.io?

Во-первых, не ясно, сколько вы говорите о том, сколько обработчиков событий в сокете.Сервер io может иметь или вы спрашиваете, сколько событий в реальном времени (как в событиях / сек) может обрабатывать сервер socket.io.

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

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


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


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

Мне также хотелось бы знать, не создали ли вы какой-то круговой цикл обработки сообщений, где clientA выдает msgA на сервер.Сервер получает это сообщение, обрабатывает его и отправляет msgB клиенту A.clientA получает это сообщение, выполняет некоторую его обработку, и некоторый побочный эффект этой обработки заставляет его снова отправлять msgA на сервер, и вы можете получить бесконечный цикл обработки сообщений.

Кроме того, комнаты в socket.ioне «иметь события» или «получать события», так что часть вашего описания не имеет смысла.Вы можете отправить событие на все розетки в комнате.Но на самом деле это просто заставляет сервер перебирать всех членов данной комнаты и отправлять им каждому сообщение по отдельности.


В соответствии с вашим редактированием, если «событие» таково:

io.on('event', function(msg){
    console.log( msg);
});

Затем количество событий, которые ваш сервер может обрабатывать в секунду, зависит от всевозможных переменных конфигурации системы (пропускная способность, производительность процессора, производительность базы данных и т. Д.) И от того, сколько обработки вы выполняете для обработки каждого входящего события.,Вот список того, что нужно сделать:

  1. Убедитесь, что у вас нет синхронного ввода-вывода где-либо на вашем сервере, кроме как во время запуска сервера, так как это мгновенно разрушит вашу способность иметь многообрабатывать события происходящие сразу.
  2. Сделать код, который обрабатывает каждое событие максимально эффективным.Если вы обращаетесь к базе данных по каждому событию, это, вероятно, сделает вашу базу данных узким местом.
  3. Разработайте несколько тестов, чтобы выяснить, где находится ваше первое узкое место в обработке.
  4. Улучшениеэксплуатационные характеристики этого первого узкого места.
  5. Ополаскивайте, вспенивайте, пока не удалите / не улучшите первые N мест, в которых вы столкнулись с узким местом.

Имейте в виду, что одинЭкземпляр node.js имеет только один поток, в котором выполняется ваш Javascript.Таким образом, если вы хотите иметь возможность обрабатывать 100 сообщений в секунду, вы можете использовать не более 10 мс ЦП для обработки каждого сообщения (1000 мс / сек, деленное на 100 сообщений / сек = 10 мс / сообщение).Вы можете развернуть несколько ЦП, внедрив кластеризацию или запустив несколько процессов для обработки рабочей очереди, если ЦП является фактическим узким местом, но сначала вам нужно будет определить это с помощью тестирования.

...