NodeJS + SocketIO: масштабирование и предотвращение единой точки отказа - PullRequest
5 голосов
/ 16 марта 2012

Итак, первое приложение, которое люди обычно создают с помощью SocketIO и Node, - это приложение для чата.Это приложение для чата в основном имеет 1 сервер Node, который будет транслироваться нескольким клиентам.В коде узла у вас будет что-то вроде.

//Psuedocode
for(client in clients){
  if(client != messageSender){
    user.send(message);
  }
}

Это отлично подходит для небольшого числа пользователей, но я вижу проблему с этим.Во-первых, существует единственная точка отказа - сервер Node.Во-вторых, приложение будет замедляться по мере роста числа клиентов.Что делать тогда, когда мы достигнем этого узкого места?Существует ли архитектура (горизонтальное / вертикальное масштабирование), которая может быть использована для решения этой проблемы?

Ответы [ 2 ]

4 голосов
/ 18 марта 2012

Для того «одного дня», когда вашему приложению чата требуются несколько отказоустойчивых узловых серверов, и вы хотите использовать socket.io для перекрестного обмена данными между сервером и клиентом, существует модуль node.js, который подходит дляbill.

https://github.com/hookio/hook.io

По сути, это среда, генерирующая события, для перекрестной связи между несколькими «вещами» - например, серверами с несколькими узлами.

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

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

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

2 голосов
/ 16 марта 2012

Поскольку Node.js имеет единственную нить цикла обработки событий, эта единственная точка отказа записывается в его ДНК. Даже перезагрузка сервера после изменения кода требует остановки этого потока.

Однако существует множество инструментов для изящной обработки таких сбоев. Вы можете использовать навсегда ; простой инструмент CLI для обеспечения непрерывной работы данного скрипта. Другие варианты включают распространять и до . Distribute - это промежуточное ПО балансировки нагрузки для Node. Up строит поверх Distribute, предлагая нулевые перезагрузки с использованием либо API-интерфейса JavaScript, либо интерфейса командной строки:

Дальнейшее чтение Я считаю, что вам просто нужно использовать Redis Store с Socket.io для поддержки ссылок на соединения между двумя или более процессами / серверами. Эти варианты уже широко обсуждались здесь и здесь .

Существует также возможность использования socket.io-clusterhub , если вы не собираетесь использовать хранилище Redis.

...