阅读 831

[译]Node.js应用如何添加健康检测?

快速检测应用程序的运行情况而无需深挖代码。

随着应用程序用户量的增多,软件的可用性将面临巨大的考验。让我们来看一看为什么应用程序需要高可用性。

我们为什么需要应用程序的高可用性。

  • SLAS,你经常指定一个你可用达到的特定可用性(比如 99.9%)。
  • 对于B2C应用(比如网上店铺),宕机可能意味着高额的经济损失。
  • 除了经济影响,意外宕机还会损害你的声誉。

现在我们明白为什么我们需要高可用性了。我们将研究可能导致宕机的常见问题。

可用性如何能受到负面影响?

  • 一些妨碍你应用程序正常运行的关键问题(比如,连接数据库失败)。
  • 第三方基础服务问题(比如,你的云服务供应商异常宕机)。

显然,我们应该对确保我们的应用程序高可用非常感兴趣。

但是问题是:“应用程序什么时候才是真正的健康?”。这很难去说清楚,也很难实现。这取决于你对健康的定义。所以你必须自己去定义这件事情。

如何去定义应用程序的健康度?

  • 服务可以响应请求
  • 服务可以响应请求并且连接数据库。
  • 服务可以响应请求,连接数据库并且连接其他第三方系统和集成系统。

API测试可以作为启动健康检测的入口。然而,也有专门的服务,如PingdomNew RelicFreshping,可以持续监控网站和服务的可用性。

这些工具提供通用的数据和功能:

  • 可用性
  • 宕机实际
  • 事件数
  • 平均响应时间(通常为毫秒级别)
  • 事故摘要
  • 根据时间查询相关数据
  • 与其他流行软件工具集成:SlackJiraPagerDuty等。

为什么要在软件工程里使用健康检测?

  • 健康检测很容易去实现。如上所述,你必须去定义健康对你的意义。
  • 不宕机发布,如发布平台在发布应用程序时,自动调用健康检测路由。
  • 及时发现宕机。这里有很多免费和收费的工具,能够提供运行时持续监控,如PingdomNew RelicFreshping
  • 当问题出现时,健康检测提供了一个完善的检查。如果你有即将执行的任务,而且出了一些问题(如:一个实例停止运行了),那么最首要,也最简单的事情是在无须深挖当前代码的情况下,去检查服务的健康度。因此,即使最基础的健康检测也有一定的价值。
  • 在这篇教程中,我们将使用Express.js这个热门的Node.js框架。不过,如果你使用其他框架或者编程预言,如:C#Java或者Python,步骤也是一样的。

Node.js应用如何进行健康检测?

  1. 创建一个新的路由(如:healthcheck.routes.js)。
  2. app.js中注册你的路由。我推荐使用healthcheck命名这个路由。
  3. 在你的健康检测路由中,如果一切正常你需要,发送一个成功响应。如果你的应用程序不健康,你需要发送一个错误响应。
  4. 如果你有的很多微服务,你应该给每个都添加一个健康检测。
  5. 可选项:添加身份验证以限制对你的健康检查路由的访问。
  6. 可选项:添加一个调用新路由的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这样的工具经常能够检查我们应用程序的健康,同时帮助我们及早的发现问题。

你是如何实现健康检测的呢?还有,你使用什么样的工具?

文章分类
后端
文章标签