我正在尝试为我的代码编写运行状况检查(此检查涉及与Cassandra DB和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制片人出错:{"消息":"找不到经纪人"}
我有这个代码的另一个版本(没有承诺)并且运行正常,所以我确定我的问题不在于Kafka。
你能告诉我我的代码中有什么错误吗?
P.S。我还查看了这个链接:Wrapping Node.js callbacks in Promises using Bluebird 它没有帮助我。
修改 这是工作代码:
// 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");
}
});
};
答案 0 :(得分:1)
执行此操作时:
app.get('/stats/health', function(req, res, next) {
Promise.all([cassandraPromise, kafkaPromise])
});
var cassandraPromise = new Promise(...);
var kafkaPromise = new Promise(...);
您创建两个将立即加载的承诺 。我认为您的kafka客户端还没有准备就绪并且没有兑现承诺。
然后(比如30秒之后),当您致电/stats/health
时,您使用现有的两个承诺已经解决。 Promise.all
以失败的承诺结束(因为kafkaPromise
在30秒前失败了。)
您想要做的是每次都创建一个新的承诺:
function checkCassandra() {
return new Promise(...);
}
function checkKafka() {
return new Promise(...);
}
app.get('/stats/health', function(req, res, next) {
Promise.all([checkCassandra(), checkKafka()])
});
这样,每次调用健康检查时,都会触发对cassandra / kafka的调用。
(我要求确认工作代码,如果我错过了,我会更新我的答案。)