- 原文链接:How To Add a Health Check to Your Node.js App
- 原文作者:Ali Kamalizade
- 仓库地址:github

快速检测应用程序的运行情况而无需深挖代码。
随着应用程序用户量的增多,软件的可用性将面临巨大的考验。让我们来看一看为什么应用程序需要高可用性。
我们为什么需要应用程序的高可用性。
- 在SLAS,你经常指定一个你可用达到的特定可用性(比如 99.9%)。
- 对于
B2C应用(比如网上店铺),宕机可能意味着高额的经济损失。 - 除了经济影响,意外宕机还会损害你的声誉。
现在我们明白为什么我们需要高可用性了。我们将研究可能导致宕机的常见问题。
可用性如何能受到负面影响?
- 一些妨碍你应用程序正常运行的关键问题(比如,连接数据库失败)。
- 第三方基础服务问题(比如,你的云服务供应商异常宕机)。
显然,我们应该对确保我们的应用程序高可用非常感兴趣。
但是问题是:“应用程序什么时候才是真正的健康?”。这很难去说清楚,也很难实现。这取决于你对健康的定义。所以你必须自己去定义这件事情。
如何去定义应用程序的健康度?
- 服务可以响应请求
- 服务可以响应请求并且连接数据库。
- 服务可以响应请求,连接数据库并且连接其他第三方系统和集成系统。
API测试可以作为启动健康检测的入口。然而,也有专门的服务,如Pingdom、New Relic和Freshping,可以持续监控网站和服务的可用性。
这些工具提供通用的数据和功能:
- 可用性
- 宕机实际
- 事件数
- 平均响应时间(通常为毫秒级别)
- 事故摘要
- 根据时间查询相关数据
- 与其他流行软件工具集成:
Slack、Jira、PagerDuty等。
为什么要在软件工程里使用健康检测?
- 健康检测很容易去实现。如上所述,你必须去定义健康对你的意义。
- 不宕机发布,如发布平台在发布应用程序时,自动调用健康检测路由。
- 及时发现宕机。这里有很多免费和收费的工具,能够提供运行时持续监控,如
Pingdom、New Relic和Freshping。 - 当问题出现时,健康检测提供了一个完善的检查。如果你有即将执行的任务,而且出了一些问题(如:一个实例停止运行了),那么最首要,也最简单的事情是在无须深挖当前代码的情况下,去检查服务的健康度。因此,即使最基础的健康检测也有一定的价值。
- 在这篇教程中,我们将使用
Express.js这个热门的Node.js框架。不过,如果你使用其他框架或者编程预言,如:C#、Java或者Python,步骤也是一样的。
Node.js应用如何进行健康检测?
- 创建一个新的路由(如:
healthcheck.routes.js)。 - 在
app.js中注册你的路由。我推荐使用healthcheck命名这个路由。 - 在你的健康检测路由中,如果一切正常你需要,发送一个成功响应。如果你的应用程序不健康,你需要发送一个错误响应。
- 如果你有的很多微服务,你应该给每个都添加一个健康检测。
- 可选项:添加身份验证以限制对你的健康检查路由的访问。
- 可选项:添加一个调用新路由的
API测试。
// app.js: register the route. In our case, we don't want authorization for this route
app.use('/healthcheck', require('./routes/healthcheck.routes'));
// healthcheck.routes.js: return a 2xx response when your server is healthy, else send a 5xx response
import express from 'express';
const router = express.Router({});
router.get('/', async (_req, res, _next) => {
// optional: add further things to check (e.g. connecting to dababase)
const healthcheck = {
uptime: process.uptime(),
message: 'OK',
timestamp: Date.now()
};
try {
res.send();
} catch (e) {
healthcheck.message = e;
res.status(503).send();
}
});
// export router with all routes included
module.exports = router;
// healthcheck.spec.js (services like Pingdom or Freshping do a similar approach to check whether your server is healthy)
describe('Healthcheck', () => {
it('returns 200 if server is healthy', async () => {
const res = await get(`/healthcheck`, null)
.expect(200);
expect(res.body.uptime).toBeGreaterThan(0);
});
});
我们如何使用健康检测的工具呢,这些工具也如何支持我们的应用?
在这篇教程中,我将使用Freshping去监控托管API的运行情况。以下报告显示了2019年10月的数据。

让我们仔细的看一看这篇报告:
-
在选择的时间表里,可用性达到了96.58%。通常情况下,你应该以把达到99.90%的可用性为目标。很多软件库保证至少99.90%的可用性,特别是对于企业用户。
-
乍一看96.58%的可用性听起来不错,但你必须注意宕机时间:将近19个小时的连续停机时间对你的业务而言可能是非常糟糕的。 因此,重要的是在事件发生时及早通知您,以便您快速解决问题。
-
因此,当事故发送时,及早通知是非常重要的,那样你将能够快速的修复问题。
-
在所选的时间范围内出现了一个事故。当然,你应该尝试尽可能的使这个数字越小越好。在事故确实发生的情况下,应该尽可能快的解决问题,去减小事故带来的影响。
-
平均响应时间是
539ms,相当稳定。这种一致性是一个好兆头,因为这意味着我们的健康检查工作可靠。 -
尽管平均响应时间不算太慢,但是也不算太快。因此你应该尽可能缩短响应时间。这可能表明应用程序的健康涉及到很多环节。另一方面,这可能只是基础架构问题(例如,服务器离客户端太远或硬件功能不够强大)。
结语
感觉你阅读这篇文章。你可以看到,Node.js添加健康检测是非常简单的。当然,你也可以(或许应该)添加健康检测,如果你正在使用其他服务端编程语言。像Pingdom或者Freshping这样的工具经常能够检查我们应用程序的健康,同时帮助我们及早的发现问题。
你是如何实现健康检测的呢?还有,你使用什么样的工具?