我正在尝试为我的代码编写一个健康检查(这个检查涉及到与cassandradb和kafka的通信)。
这是我写的代码:
// health-check
app.get('/stats/health', function(req, res, next) {
Promise.all([cassandraPromise, kafkaPromise])
.then(console.log("Everything is OK"),
console.log("FAILED!"));
});
var cassandraPromise = new Promise(function(resolve, reject){
*****.client.state.cassandraClient.execute('SELECT vehicle_id FROM vehicles.vehicles LIMIT 1', function(err) {
if (err) {
console.log ('Health Check for Cassandra failed');
//res.write("Cassandra health check FAILED\n");
reject(err);
} else {
console.log('Health Check for Cassandra passed\n');
resolve(200);
}
});
});
var kafkaPromise = new Promise(function(resolve,reject) {
stats.kafkaService.producer.send( [{topic: 'health_check', messages: 'health check message'}], function(err,data) {
if (err) {
//res.write("Health Check for Kafka failed\n");
console.log("Health Check for Kafka failed");
reject(err);
} else {
console.log("Health Check for Kafka passed");
resolve(200);
}
});
});
错误信息是:
“queryfetchsize”未定义。使用默认值:“25000”
未定义“socketreadtimeout”。使用默认值:“30000”
kafka producer出错:{“message”:“找不到代理”}
我有另一个版本的代码(没有承诺),它运行正常,所以我相信我的问题不是Kafka。
你能告诉我代码中有哪些错误吗?
p、 我还查看了这个链接:使用bluebird在promises中 Package node.js回调,但对我没有帮助。
编辑:以下是工作代码:
// health-check
app.get('/stats/health', cassandraHealthCheck, kafkaHealthCheck);
function cassandraHealthCheck(req, res, next) {
******.client.state.cassandraClient.execute('SELECT vehicle_id FROM vehicles.vehicles LIMIT 1', function(err) {
if (err) {
console.log ('Health Check for Cassandra failed');
} else {
console.log('Health Check for Cassandra passed');
next();
}
});
}
function kafkaHealthCheck(req, res, next) {
stats.kafkaService.producer.send( [{topic: 'health_check', messages: 'health check message'}], function(err,data) {
if (err) {
console.log("Health Check for Kafka failed");
} else {
console.log("Health Check for Kafka passed");
}
});
};
1条答案
按热度按时间qxgroojn1#
当您这样做时:
您创建了两个承诺,将立即加载。我认为你的Kafka客户还没有准备好,没有兑现诺言。
然后(比如30秒后),当你打电话的时候
/stats/health
,则使用已解决的两个现有承诺。这个Promise.all
以失败的承诺结束(因为kafkaPromise
30秒前失败)。您要做的是每次都创建一个新的承诺:
这样,每次你调用健康检查时,都会触发对Cassandra/Kafka的调用。
(我要求工作代码确认,如果我错过了,我会更新我的答案)。