Сообщение от pax
1. Как правильно обрабатывать ошибки, чтобы при их происхождении не падал весь процесс. Можно конкретно для express и mongodb.
|
В примерах я делал 'throw', обычно я так не делаю.
Важно понимать что ошибки - это важно, и их не должно быть.
Если в тестировании ошибок в запросах к бд небыло, а потом есть, значит твой query слишком динамичен и нужно его немного нормализировать (это 90% случаев).
Я у себя в коде так делаю:
Ранее при настройке express'а:
app.configure(function() {
app.use(express.errorHandler());
...
});
app.get('/users', ..., function(req, res, next) {
users.find({ }, { skip: req.paginator.skip, limit: req.paginator.limit }).toArray(function(err, data) {
if (!err) {
res.json(data);
} else {
next(err);
}
});
});
Далее где-то в коде самый последний middleware будет для ловли ошибок:
app.use(function(err, req, res, next) {
var obj = {
error: true,
message: err.message
};
if (development) {
obj.stack= err.stack;
}
res.json(obj);
});
Сообщение от pax
2. Я так понимаю что кластер можно использовать как защиту от падения процесса, т.е. кластер при падении одного воркера может запустить нового воркера? И если надо будет перезапустить сервер, то просто необходимо будет перезапустить кластер да?
|
Да. Но нужно следить точно когда что-то падает или нет.
Вообще есть "защито" от падения процесса. Есть event который ловит не словленные exception'ы. Но естественно если что-то жесть как пошло не так, то нужно и реагировать соответственно, а не тупо игнорировать.
Но всё равно:
process.on('uncaughtException', function(err) {
console.log('Caught exception: ' + err, err.stack);
});
Сообщение от pax
3. Какой модуль лучше использовать для логирования? Особенно если используется кластер и несколько воркеров.
|
Я пока настраивал node.js как сервис в linux, тупо выводил консоль в файл, естественно это не супер решение. И исследовал этот вопрос. Лидер тут конкретный:
winston https://github.com/flatiron/winston , отлично поддерживается.
Суть у него в том что он имеет основу для логгирования, но логит в транспорты, которые могут быть что угодно: консоль, файл, бд, MQ, redis, socket, amazon alerts, email, и т.п.
Есть стандартный набор транспортов которых обычно хватает с головой.
Я лично юзать буду файл + бд (с индексом просрочивания неделю), и ZeroMQ в мелкий процесс который через socket.io будет слать логи от разных процессов мне на мелкую страничку мониторинга. Таким образом если что-то случиться, я сразу могу вычислить с кем, где и т.п.