nodejs запускает два приложения на одном порту

Чтобы сделать простои, вызванные длительными перезагрузками приложений, менее болезненными, я подумал о чем-то вроде:

  1. Основное приложение №1 на порту 80.
  2. Отказоустойчивое приложение № 2 также на порту 80, но отвечайте на запросы только в случае, если приложение № 1 не работает.
  3. Пусть приложение № 2 будет обслуживать активных пользователей.

Запуск двух процессов на одном и том же порту заканчивается Error: EADDRINUSE, поэтому простой способ не работает. Я наткнулся на событие server.on('error') и решил позволить приложению № 2 подождать, пока приложение № 1 не остановится, чтобы порт стал доступным:

function tryPitchIn(){
     var server = http.createServer(app);

     server.on('listening', function(){
        console.log('Application #1 crashed/ended');
        console.log('Pitching in...');
     });

     server.on('error', function(){
        console.log('noting to do');
        setTimeout(tryPitchIn, 250);
     });

     server.listen(80);
}

tryPitchIn();

Хотя вышеизложенное работает отлично, мне приходится бороться с завершением приложения № 2 при инициализации приложения № 1, что нелегко сделать в разных операционных системах.

Можно ли дать процессу узла (инициированному npm start) статический идентификатор, чтобы завершить его из другого процесса - предпочтительно кросс-ОС? Или другие идеи для сценария?


person RienNeVaPlu͢s    schedule 01.10.2013    source источник
comment
Я не хочу перезапускать его, я просто хочу вместо этого обслуживать активных пользователей на странице «мы поддерживаем наш сервис»! (Мне нужно перезапустить сервер при обновлении приложений, что может занять несколько секунд для создания общедоступных библиотек и т. д.)   -  person RienNeVaPlu͢s    schedule 01.10.2013
comment
Обратное проксирование вашего приложения за чем-то вроде Nginx является допустимой (и распространенной) стратегией.   -  person Michelle Tilley    schedule 01.10.2013


Ответы (2)


Вы можете обслуживать свое приложение № 1 на другом порту и написать микроприложение, которое будет передавать ему прокси-запросы и возвращать что-то еще, если запрос к приложению № 1 не будет выполнен. Вы можете использовать node-http-proxy, например здесь или создайте свое собственное решение, например это, и просто добавьте "on пункт "ошибка".

person Amadan    schedule 01.10.2013

Мне нравится ответ Амадана. Кроме того, я должен упомянуть, что делать что-либо кроме входа в систему .on('error') (а также для unchaughtException) не рекомендуется. Система может находиться в нестабильном состоянии (например, внутренние состояния модулей могут быть несогласованными), и вы не хотите продолжать работать так долго.

Либо делайте то, что говорит Амадан, либо используйте домены node.js, либо используйте несколько процессов за балансировщиком нагрузки (что в основном и говорит Амадан).

person Nitzan Shaked    schedule 01.10.2013