Я пытаюсь создать отказоустойчивые и отказоустойчивые сервисы. В качестве теста я намеренно заставляю его аварийно завершать работу с неопределенной переменной вне блока try-catch.
Я вызываю этолокально через http-клиент nodejs, сначала я намеренно вызываю ошибку, а затем продолжаю вызывать службу.
При первой ошибке ECONNRESET
{
"code": "ECONNRESET",
"message": "socket hang up",
"stack": "Error: socket hang up\n at createHangUpError (_http_client.js:323:15)\n at Socket.socketOnEnd (_http_client.js:426:23)\n at Socket.emit (events.js:203:15)\n at endReadableNT (_stream_readable.js:1145:12)\n at process._tickCallback (internal/process/next_tick.js:63:19)"
}
Повторный вызов той же службы ECONNREFUSED
{
"code": "ECONNREFUSED",
"message": "connect ECONNREFUSED 172.20.0.4:3000",
"stack": "Error: connect ECONNREFUSED 172.20.0.4:3000\n at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1106:14)"
}
Микросервис - код с преднамеренной ошибкой
function getEmployee() {
return new Promise(function (resolve, reject) {
let sql = "SELECT * FROM employee";
db.query(sql, function(error, result){
console.log(a); // undefined var
try {
if(error) {
reject({status: 500, result: error});
} else {
resolve({status: 200, result: result});
}
} catch(err) {
reject({status: 500, result: err});
}
});
});
};
Код, вызывающий конечную точку микросервиса
function getEmployee() {
return new Promise(function (resolve, reject) {
http.request({
method: "GET",
hostname: "localhost",
port: 3000,
path: "/employees"
}, function(response){
let buffers = [];
response.on("data", buffers.push.bind(buffers));
response.on("end", function(){
let data = JSON.parse(Buffer.concat(buffers).toString());
response.statusCode == 200 ? resolve(data) : reject(data);
});
}).on("error", reject).end();
});
};
Вопрос в том, как мне приблизиться к тому, чтобы сервер nodejs восстанавливался после ошибок и проходили последующие вызовы к этой конечной точке или другим конечным точкам?