NodeJS + SocketIO: масштабирование и предотвращение единой точки отказа

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

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

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


person denniss    schedule 16.03.2012    source источник
comment
Сколько клиентов вы ожидаете подключить к серверу? Чтобы этот цикл был заметно медленным, я бы сказал, что вам нужно несколько тысяч, если не десятков тысяч.   -  person Some programmer dude    schedule 16.03.2012
comment
ну, это немного, если у вас миллионы пользователей, верно?   -  person denniss    schedule 16.03.2012


Ответы (2)


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

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

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

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

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

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

person arnorhs    schedule 18.03.2012

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

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

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

Также можно использовать socket.io-clusterhub, если вы не собираетесь используйте магазин Redis.

person almypal    schedule 16.03.2012
comment
Вы когда-нибудь пробовали использовать дистрибутив? Мне просто интересно, как он сможет транслировать для всех пользователей. кажется, что каждый узел должен знать обо всех подключенных пользователях. - person denniss; 16.03.2012