Чтобы сделать простои, вызванные длительными перезагрузками приложений, менее болезненными, я подумал о чем-то вроде:
- Основное приложение №1 на порту 80.
- Отказоустойчивое приложение № 2 также на порту 80, но отвечайте на запросы только в случае, если приложение № 1 не работает.
- Пусть приложение № 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
) статический идентификатор, чтобы завершить его из другого процесса - предпочтительно кросс-ОС? Или другие идеи для сценария?