如何利用NJS实现基于业务指标的动态加权轮询调度教程

酷宇大大_6689

酷宇大大_6689

2026-06-03

451人浏览

原创

NJS可实现基于业务指标的动态加权轮询:通过ngx.shared字典存储节点实时指标(响应时间、错误率、健康状态),在proxy_pass前由choose_backend.js按score = base_weight × (1−err_rate) / (rt_ms/100)公式计算并归一化权重,再执行平滑加权轮询选节点,彻底绕过upstream静态weight限制。

如何利用njs实现基于业务指标的动态加权轮询调度教程

直接用 NJS(Nginx JavaScript)实现基于业务指标的动态加权轮询,核心在于绕过静态 weight 参数,改由 JS 在每次请求时实时计算各节点的调度权重,并结合健康状态、响应延迟、错误率等真实指标动态调整。Nginx 原生加权轮询不支持运行时权重变更,但 NJS 提供了 ngx.shared 字典 + subrequest + 自定义调度逻辑的能力,可构建真正闭环的动态调度系统。

一、NJS 动态加权轮询的核心架构

不依赖 upstream 的 weight 指令,而是把后端列表和实时指标存入共享字典,由 NJS 函数在 proxy_pass 前执行调度决策:

  • 用 ngx.shared.upstream_state 存储每台后端的:当前权重(current_weight)、最近 30 秒平均响应时间(rt_ms)、5xx 错误率(err_rate)、是否健康(up)
  • 编写 choose_backend.js:读取所有节点状态,按公式重新归一化权重(例如:score = base_weight * (1 - err_rate) / max(1, rt_ms / 100)),再做平滑加权轮询(Smooth WRR)选节点
  • 通过 subrequest 或定时 timer 调用健康检查接口,异步更新共享字典中的指标

二、关键配置与代码示例

需启用 NJS 模块(Nginx ≥ 1.19.2,编译时含 --add-dynamic-module=nginx-plus-module-njs 或使用官方预编译包):

1. nginx.conf 中声明共享字典与加载脚本

js_shared_dict upstream_state 10m;
js_import /etc/nginx/choose_backend.js;
upstream backend_pool {
    # 空 upstream,仅作占位;真实转发由 proxy_pass 变量控制
    server 127.0.0.1:1; # 防止配置校验失败
}
server {
    listen 80;
    location / {
        js_set $backend choose_backend.choose;
        proxy_pass http://$backend;
    }
}

2. choose_backend.js 核心逻辑(简化版)

js2java
js2java

JavaScript 到 Java 全栈翻译助手,专为前端开发者学习 Java 或快速实现后端业务逻辑而设计。当用户提到以下场景时必须使用此技能: - "帮我把这段 JS 代码转成 Java" - "用 Java 怎么写这个逻辑" - "我习惯用 JS 写,想翻译成 Java" - "教我 Java,我要写后端接...

下载
const dict = ngx.shared.upstream_state;
const backends = ['192.168.1.10:8080', '192.168.1.11:8080', '192.168.1.12:8080'];
const baseWeights = { '192.168.1.10:8080': 5, '192.168.1.11:8080': 3, '192.168.1.12:8080': 2 };
<p>function getScore(backend) {
const info = dict.get(backend);
if (!info || !info.up) return 0;
const rt = Math.max(10, info.rt_ms || 100);
const err = info.err_rate || 0;
return baseWeights[backend] * (1 - err) / (rt / 100);
}</p><p>export function choose(r) {
let candidates = [];
for (let b of backends) {
const score = getScore(b);
if (score > 0) candidates.push({ b, score });
}
if (candidates.length === 0) return '192.168.1.10:8080'; // fallback</p><pre class="brush:php;toolbar:false;">// 简单加权随机(适合中小流量)或实现 Smooth WRR 状态机
const total = candidates.reduce((s, c) => s + c.score, 0);
let rand = Math.random() * total;
for (let c of candidates) {
    rand -= c.score;
    if (rand <p>}</p>

三、业务指标采集与更新机制

动态权重的价值取决于指标的真实性和时效性。推荐两种低侵入方式:

  • 主动探测:用 NJS timer 每 5 秒对每个后端发 HEAD 请求,记录耗时与状态码,写入 upstream_state
  • 被动埋点:在后端返回头中注入自定义字段(如 X-Backend-Metrics: rt=42,err=0.01),NJS 在 log_by_lua_block(若混用 Lua)或通过 NJS 的 ngx.req.start_time() + ngx.var.upstream_response_time 计算 RT,再聚合统计错误率

注意:共享字典是进程级的,多 worker 间自动同步,无需额外锁机制。

四、上线前必须验证的三点

避免“动态”变成“失控”:

  • 设置权重下限(如 score
  • 所有后端初始状态必须预设(如首次读取为 null 时,用 baseWeight + 默认 RT=200ms + err=0),否则首请求可能无节点可选
  • 添加降级开关:在共享字典中设 dict.set('mode', 'static'),choose() 函数检测到后直接走固定轮询,便于故障时快速回滚

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

nginx负载均衡 js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

403

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3447

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

6165

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

561

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1476

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3958

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

477

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

159

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程