2013-12-10 4 views
8

Я новичок в nodejs. Я пытаюсь использовать nodejs в производстве. Я хотел бы добиться отказа в работе nodejs. Когда я выполняю приложение чата, если сервер узла терпит неудачу, чат не должен прерываться и должен быть автоматически подключен к другому серверу-узлам, и для дальнейшего общения должен использоваться тот же самый идентификатор сокета, чтобы сообщение чата не должно было гаснуть. Можно ли это достичь? Любые образцы.Nodejs failover

Я не должен использовать Ngnix/HAProxy. Также дайте мне знать, как должны быть узловые серверы: либо Active-Active, либо Active-Passive

ответ

1

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

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

Небольшой пример будет с потоками.

(Websocket Router) 
|  
|_(Chat Channel #1) \ 
|_(Chat Channel #2) - Channel Cache // hold last 15 messages of every channel 
|_(Chat Channel #3)/
|_(Authentication handler) // login-logout 

- Надеюсь, я помог в некотором роде.

+0

Спасибо за ответ. Фактически, что я пытаюсь достичь, у меня есть два узла серверов. Я получаю доступ к ним через apache. В apache я использовал ProxyPass и mod_proxy_balancer для маршрутизации на сервер узлов. Я установил failonstatus = 503 в балансе. Поскольку apache не поддерживает (используя 2.2) websocket, устанавливается соединение xhr-polling. Основная проблема заключается в том, что мы запускаем два узла серверов, на которых клиент пытается установить соединение с сервером узлов. На узловом сервере мы нашли цикл, «клиент, который не имеет клиентский ключ, должен снова подключиться». Любая идея, как преодолеть это? – user2344173

+0

У меня нет большого опыта работы с apache в том виде, который вы описываете, возможно, что его неспособность прокси-запросов к серверу узлов веб-сервера, возможно обходное решение заключается в том, чтобы запускать отдельно сервер узла и сервер Apache, обслуживать клиентский статический клиент socket.io и попытаться подключиться к серверу узлов, что, в свою очередь, каким-то образом аутентифицирует его, возможно, попытается проверить cookie/сеанс из «общей» точки. Кроме того, если вы просто обслуживаете статические файлы с помощью apache, просто попробуйте безболезненно переключиться на статический файловый сервер nodejs, это сэкономит массу усилий. – Gntem

3

Там же несколько проблем есть вы решать сразу там:

Daemonization - сохраняя свое приложение до: Как уже упоминалось, сценарии, такие как forever могут быть использованы для контроля приложения nodeJS перезапустить его сбою. Это полезно для запуска приложения в случае неудачного отказа.

Аналогичным образом recluster может использоваться для разветвления вашего приложения и повышения его устойчивости к сбоям путем создания процесса и подпроцессов супервизора.

Необязанные исключения: Известный барьер в nodejs заключается в том, что асинхронные ошибки не могут быть захвачены блоком try/catch. В результате исключения могут всплыть и привести к сбою всего вашего приложения.

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

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

Безопасность: Это огромная тема. Вы должны обеспечить, по крайней мере:

  1. Ваше приложение работает как внекорневой пользователя с наименьшими привилегиями. Для портов < 1024 требуются права root. Обычно это проксируется из более высокого порта с nginx, докерером или аналогичным.
  2. Вы используете helmet и затвердели свое приложение в той степени, в какой можете.

Как я уже сказал, вы используете Apache перед NodeJS, это не обязательно, поскольку apache, вероятно, будет работать под нагрузкой с помощью своей модели Threading больше, чем nodeJS с его моделью цикла событий.

1

Для простого подхода, я думаю, вы должны создать механизм повторного подключения на своей стороне клиента и использовать управление процессами как forever или PM2 для управления процессами Node.js. Я пытался слишком много способов, но по-прежнему не могу преодолеть проблему сокета, он всегда убивается всякий раз, когда процесс останавливается.

7

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

Введение нижеследовал,

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

Запуск приложения в рабочем режиме так же легко, как:

$ pm2 start app.js 

PM2 постоянно одолевали более 700 тестов.

Официальный сайт: http://pm2.keymetrics.io

Работает на Linux (стабильный) & MacOSX (стабильный) & для Windows (бета-версия).

0

Вы можете использовать Pm2 start app.js -I 0. Это запустило бы ваше приложение в режиме кластера, создавая много дочерних процессов для одного потока. Вы можете делиться информацией о сокетах между различными процессами.