Node.js健康检查和过载保护

这篇具有很好参考价值的文章主要介绍了Node.js健康检查和过载保护。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Node.js健康检查和过载保护[图片来源:unsplash.com[1]]

设想一下,你有30个Node服务器与 "Nginx "服务器平衡。服务器的负载被平均分配,所以如果你有9000个用户,每个服务器有300个客户。把负载平均分配给每台服务器并不意味着你可以避免过载,因为你的工作对每个用户都可能不同。例如,对于user_1,你可能读取3个文件,但对于user_2,你可能需要读取10个(3.34倍)。根据用户的请求过程会有更多的复杂性,这是现实中需要去思考和解决的问题。在类似于这种的情况之下,开发者不得不平衡对同每一台服务器的请求,因为一旦这台服务器是Server Overload(过载)的状态,你的服务可能会挂掉。

健康检查 每隔n秒向服务器发送请求,以了解服务器是否能够处理更多的请求,如果正常,服务器将其标记为OK,并继续从Balancer(平衡器)接收更多的请求,否则服务器将其标记为Error,Balancer将不会向该服务器发送任何请求,直到Balancer再次发送健康检查请求并标记为OK。

这个过程被称为健康检查。

作为检测应用是否正常运行的机制,服务器健康检查通常在以下情况下使用:

  1. 高可用性

  2. 负载均衡:如果正在使用多个实例运行同一项目或者应用,则可以将负载平衡器配置为定期查询每个实例并记录其响应时间和状态。

  3. 自动化部署:自动化部署过程中包括激活新版本后立即执行的测试步骤,这些测试步骤大多数都涉及到对系统组件进行基本的功能验证或心跳监控。

  4. 监控和警报:当服务不再可访问或出现其他问题时,服务器健康检查可以触发警报并通知管理员或开发人员进行干预操作。

实际应用

以下是基于Express和Node.js实现健康检查的简单Demo:

  1. 安装healthcheck模块:使用npm或yarn等包管理工具安装healthcheck模块。

  2. 在Express应用中添加路由:创建一个新路由来处理/healthcheck请求,并返回200 OK响应。

const healthCheck = require('express-healthcheck');

app.use('/health', healthCheck({
  healthy: function () {
    return { everything: 'is ok' };
  }
}));
  1. 向监控系统报告:如果正在使用譬如Prometheus[2]之类的监控系统,则可以将其配置为定期查询/health接口并记录结果。此外,还可以将结果发送到其他系统进行分析和通知。

  2. 添加自定义检查项:除了默认提供的基本系统信息之外,还可以编写自己的检查函数来测试特定组件或功能是否可用。这些函数必须返回承诺对象并被注册到健康检查器中:

const checkDbConnection = async () => {
  try {
    const client = await pool.connect();
    await client.query('SELECT NOW()');
    return true;
  } catch (e) {
    console.error(e);
    return false;
  }
};

const customChecks = [checkDbConnection];

app.use('/health', healthCheck({
  healthy: function () {
    return { everything: 'is ok' };
  },
  customChecks
}));

结合着nginx和node.js做健康检查

考虑到实际项目中广泛使用Nginx的现状,所以笔者推荐使用nginx_upstream_check_module(不随Nginx源码分发)和Node.js来实现服务器健康检查:

  1. 首先,在Nginx配置文件中启用upstream_check模块。例如,可以在http块中添加如下代码:

http {
  upstream myapp {
    server localhost:3000;

    check interval=3000 rise=2 fall=3 timeout=2000 type=http;
    check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
  }
}

这将创建一个名为myapp的上游组,并且每隔3秒钟会向localhost:3000发送一个HTTP HEAD请求以检查其状态。

  1. 在Node.js应用中,按照前面提到的方法设置/ healthcheck路由(或任何其他自定义路由)。

const healthCheck = require('express-healthcheck');

app.use('/health', healthCheck({
  healthy: function () {
    return { everything: 'is ok' };
  }
}));
  1. 确保应用正在侦听端口3000并运行。如果需要更改端口,请相应地更新Nginx配置文件。

  2. 最后,在浏览器中访问http://localhost/_nginx_health_check/myapp(根据需要更改主机和路径),以确保Nginx正确显示了myapp上游组件的状态,并且已经能够成功连接到Node.js服务端点。

通过以上几个步骤,就可以将nginx_upstream_check_module和Node.js结合起来创建一个强大的健康检查机制。

尽管ngx_http_healthcheck_module拥有着高效、零活且易于配置的优点,但是由于其仅适用于 HTTP 服务,不支持 TCP 或 UDP 健康检查:如果要检测连接到非 Web 服务器(如数据库)是否正常工作,则需要另外使用第三方组件或软件包。

HAProxy

HAProxy[3]是一个开源的负载均衡工具,可以将来自客户端的请求分发到多个后端服务器,并确保这些请求能够平衡地分配给所有可用的服务器。HAProxy支持多种协议,例如HTTP、TCP和SMTP等。

HAProxy最初是为高可用性而设计的,在其最简单的形式下,它只需配置两个或更多台服务器即可实现基本负载均衡。但随着时间推移和版本更新,它已经成为一款功能强大且广泛应用于各种场景中(包括大型企业网络)的软件。

除了提供负载均衡之外,HAProxy还具有其他有用功能。例如:

  1. 健康检查:HAProxy可以定期检查后端服务器是否健康,并根据需要启停不健康或超时连接。

  2. SSL终止:HAProxy可以在前置代理层上执行SSL加密和解密操作。

  3. 请求重写:HAProxy允许使用ACL规则对传入请求进行修改或过滤。

  4. 日志记录:HAProxy生成详细日志以便于跟踪问题并进行性能优化。

HAProxy可以与Nginx和NodeJS结合使用,以提供一个高性能、可扩展和可靠的网络服务基础设施。以下是将这些技术结合起来使用的一种可能方式:

  1. 使用Nginx作为一个反向代理:在这种配置中,Nginx作为前端服务器,接收所有来自客户端的传入请求,并将其转发到适当的后端服务器进行处理。开发者可以配置Nginx分别在80或443端口监听HTTP或HTTPS流量。

  2. 将HAProxy配置为一个负载平衡器:HAProxy应该被配置为在运行NodeJS项目的多个后端服务器之间分配传入的流量。负载平衡算法可以根据使用者的具体需求来定制。

  3. 使用PM2部署NodeJS项目:PM2是一个进程管理器,可以轻松地在多个服务器实例上管理和扩展NodeJS项目。

  4. 在负载均衡器层面上设置SSL终端:如果开发者的应用需要SSL加密,可以通过在负载平衡器上安装SSL证书,在HAProxy层面上设置SSL终止。

下面是使用这些技术时需要考虑到的一些问题:

  • 如果应用需要在客户端请求之间保持会话数据,可能想配置粘性会话。

  • 使用ping检查或自定义脚本等工具监控服务器的健康状态。

  • 通过在Nginx和HAProxy中配置缓存规则来优化性能。

总的来说,将HAProxy与Nginx和nodeJS结合起来,为建立快速、可靠的Web服务提供了一个强大的工具集,可以处理大量的流量,同时在系统故障或中断的情况下提供强大的故障转移机制。

过载保护

为了检查服务器是否过载并防止过载,开发者通常需要检查一些指标。这也取决于项目代码逻辑是否完全准确无误,但在这里可以看到必须检查的通用指标。

  • 事件循环延迟

  • 已用堆内存

  • ...

我们可以借助于overload-protection[4]这个包,可以帮助我们快速定位到这些指标。另一个值得推荐的包是event-loop-lag[5],接受一个代表刷新事件循环滞后测量频率的毫秒数,并返回一个可以调用的函数,以接收最新的滞后测量值,单位为毫秒。

使用overload-protection包,我们可以指定限制,超过这个限服务器将无法处理更多的请求。当配置的最大请求限制通过时,软件包会自动发送503 SERVICE UNAVAILABLE。该包与http、express、restify和koa包一起工作。

但是,如果负载平衡器(Banlancer)可以发送socket进行Health Check,并且你想用socket来做,那么就需要使用别的包来完成此事了。

结语

解释 "健康检查 "和 "过载保护"[6]。

"每台服务器至少应该有一个健康检查的实现机制,这对分布式系统来说是至关重要的。"

[1]

unsplash.com: https://unsplash.com/

[2]

Prometheus: https://prometheus.io/

[3]

HAProxy: https://www.haproxy.org/

[4]

overload-protection: https://github.com/davidmarkclements/overload-protection

[5]

event-loop-lag: https://github.com/pebble/event-loop-lag

[6]

Explaining “Health Checks” and “Overload Protection”: https://blog.bitsrc.io/nodejs-health-checks-and-overload-protection-368a132a725e

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。
文章来源地址https://www.toymoban.com/news/detail-507589.html

到了这里,关于Node.js健康检查和过载保护的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • node.js 爬虫图片下载

    运行主程序前需要先安装使用到的模块: npm install superagent --save axios要安装指定版,安装最新版会报错:npm install axios@0.19.2 --save 后端爬到数据后,把结果写入index.html再返回给前端显示。 前端请求效果图 后端运行效果图 下载到文件夹的图片

    2024年02月15日
    浏览(37)
  • node.js如何将webp转jpg图片

    在Node.js中,可以使用一些库来实现将WebP图像转换为JPEG。一个常用的库是 sharp ,它是一个快速、高效的图像处理库。以下是一个简单的Node.js脚本示例,演示如何使用 sharp 库将WebP转换为JPEG: 首先,确保已经安装了 sharp 库。可以通过运行以下命令进行安装: main.js,将指定路

    2024年01月21日
    浏览(35)
  • 【微服务部署】03-健康检查

    Liveness Readiness Startup 1.1 LivenessProbe 判断服务是否存活 结束“非存活”状态服务 根据重启策略决定是否重启服务 1.2 ReadinessProbe 判断服务是否“就绪” “就绪”状态的服务可以接收请求 非“就绪”状态的服务将会被从流量负载中摘除 1.3 StartupProbe 检测应用程序是否启动成功

    2024年02月11日
    浏览(42)
  • [kubernetes]服务健康检查

    进程在运行,但是不代表应用是正常的,对此pod提供的探针可用来检测容器内的应用是否正常。k8s对pod的健康状态可以通过三类探针来检查:LivenessProbe、ReadinessProbe和StartupProbe。 用于判断容器是否存活(Running状态),如果LivenessProbe探针检测到容器不健康,则kubelet“杀掉”容

    2024年02月10日
    浏览(45)
  • 解决pod健康检查问题

    引自:Solving the mystery of pods health checks failures in Kubernetes。原文中的某些描述并不清晰,本文作了调整。 很早以前,环境中的pod有时候会遇到健康检查失败的问题,但并没有什么明显表征,且几乎是立马就会恢复。由于这种情况很少发生,且不会对业务造成影响,因此起初并

    2024年02月03日
    浏览(40)
  • Node.js: express + MySQL + Vue实现图片上传

            前段时间用Node.js: express + MySQL + Vue + element组件做了一个小项目,记录一下图片上传的实现。         将图片存入数据库有两种方法:                 1,将图片以二进制流的方式存入数据库(数据库搬家容易,比较安全,但数据库空间的消耗大,访问会比较缓慢)

    2024年02月07日
    浏览(99)
  • docker中设置容器健康检查

    在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否: 0 :成功; 1 :失败; 2 :保留值,不要使用 容器启动之后,初始状态会为 starting (启动中)。Docker Engine会等待 interval 时间,开始执行健康

    2024年02月15日
    浏览(51)
  • 17、Health Check 健康检查

    强大的自愈能力是kubernetes容器编排引擎的重要特性。 自愈的默认实现方式是自动重启发生故障的容器 。除此之外,还可通过 Liveness和Readiness探测机制 设置更精细的健康检查,进而实现如下要求: 零停机部署 避免部署无效的镜像 更加安全的滚动升级 Liveness探测和Readiness探测

    2024年02月07日
    浏览(49)
  • kylin集群反向代理(健康检查)

            前面一篇文章提到了使用nginx来对kylin集群进行反向代理, kylin集群使用nginx反向代理-CSDN博客 文章浏览阅读349次,点赞8次,收藏9次。由于是同一个集群的,元数据没有变化,所以,直接将原本的kylin使用scp的方式发送到其他节点即可。说明一下,192.168.200.12是我

    2024年02月02日
    浏览(48)
  • 如何对Docker容器进行健康检查

    熟悉使用过kubernetes的人应该知道,kubernetes支持对pod进行健康检查的功能,这对生产业务来说其实是非常有用处的,能快速发现服务不可用,并进行快速重启恢复。其实不使用kubernetes这种容器管理工具,docker自身也能实现对容器的健康检查。 从docker 1.12 版本之后,Docker 实现

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包