2013-10-01 2 views
0

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

  1. Main App # 1 на порт 80.
  2. Fail-над App # 2 в порту 80, но ответьте на запросы только в том случае, если приложение № 1 не работает.
  3. Пусть приложение №2 служит для сообщения «поддержания» для активных пользователей.

Выполнение двух процессов на одном и том же порту заканчивается на Error: EADDRINUSE - так что простой способ не работает. Я наткнулся на server.on('error') событие и решили позволить App # 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(); 

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

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

+0

Я не хочу его перезапускать, я просто хочу обслуживать активных пользователей на странице «мы поддерживаем нашу службу»! (Мне нужно перезапустить сервер на обновлениях приложений, которые могут занять серверные секунды для создания публичных библиотек и т. Д.) –

+0

Обратное проксирование вашего приложения за чем-то вроде Nginx является действительной (и общей) стратегией. –

ответ

4

Вы можете обслуживать приложение № 1 на другом порту и написать микропрограмму, которая будет запрашивать прокси-сервер, и вернуть что-то еще, если запрос на приложение № 1 не удался. Вы можете использовать node-http-proxy, как here, или катите свое собственное решение, например this, и просто добавляете предложение «по ошибке».

1

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

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