Node JS — Последнее исключение рабочего кластера журнала

Я работаю над сервером Node JS (0.10.30) вместе с его функцией кластера. Каждый раз, когда рабочий завершает работу, я перехватываю событие «выход» и перезапускаю нового рабочего. Я хотел бы также зарегистрировать (в главном кластере) причину, по которой рабочий был прекращен, например. Исключение или фатальная ошибка.

Как это сделать?

Мой файл app.js выглядит примерно так:

var cluster = require('cluster');
var numCPUs = 2;

if (cluster.isMaster) {
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  } 
  
  cluster.on('exit', function(worker, code, signal) {
	console.log('worker %d died. Starting a new worker:', worker.id);
	cluster.fork();
});

} else {
  var domain = require('domain');
  var d = domain.create();
  d.on('error', function(er) {
    console.error('error: ', er.stack);
    // I never get the memory fatal error here 
  });

  d.run(function() {
    // The memory runs out in an async call
  });
}

Спасибо, Эрез


person Erez O    schedule 06.11.2014    source источник


Ответы (1)


Ну, вы можете отправлять сообщения от воркера к мастеру с помощью функции send(), как описано в документации:

http://nodejs.org/api/cluster.html#cluster_worker_send_message_sendhandle

Но общий принцип Node заключается в том, чтобы использовать stdout и stderr по назначению, поэтому я, вероятно, просто сделал бы console.error('whatever you need to say'); на моем месте.

==== Обновлено на основе комментария ====

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

person Paul    schedule 06.11.2014
comment
Хорошо, но я ищу способ узнать, почему произошел сбой рабочего кластера (например, из-за ошибки нехватки памяти), я не смог найти способ записать это в свой файл ошибок, и поэтому я также не знаю куда попробовать отправить эту ошибку как сообщение мастеру - person Erez O; 07.11.2014
comment
Ах я вижу. Обновленный ответ - person Paul; 07.11.2014