KEDA/HPA/VPA 三件套:ABP 后台作业的事件驱动伸缩

🚀 KEDA/HPA/VPA 三件套:ABP 后台作业的事件驱动伸缩


📚 目录

  • 🚀 KEDA/HPA/VPA 三件套:ABP 后台作业的事件驱动伸缩
    • 0. TL;DR ✨
    • 1. 背景与目标 🎯
    • 2. 架构与协作机制 🧩
      • 2.1 系统总览(组件与数据流)
      • 2.2 0→1 激活 / 1→N 扩缩 时序
      • 2.3 VPA 行为
    • 3. 环境基线与安装要点 🧱
    • 4. 可复现部署清单 🛠️
      • 4.1 安装 KEDA(Helm)
      • 4.2 ABP 后台作业 Deployment(节选)
        • (可选)创建 `rmq-auth` Secret(供应用连接 AMQP)
      • 4.3 KEDA 认证 & 触发(RabbitMQ:队列长度 + 消息速率)
      • 4.4 VPA(先 `Initial` 观测,再灰度 `Auto`)
    • 5. 应用侧防抖:RateLimiter + Prefetch 🛡️
      • 5.1 后台作业可直接复用的 RateLimiter
      • 5.2 ABP RabbitMQ Prefetch(精确控并发)
    • 6. 压测与验证 🧪
    • 7. 误触发与噪声治理 🧭
    • 8. SLO 门槛与监控建议 📈
    • 9. 常见坑与最佳实践 ✅


0. TL;DR ✨

  • KEDA 👉 负责事件触发0↔1 激活/休眠;并自动创建/接管 HPA(请不要再手写同目标的 HPA)。
  • HPA 👉 负责1↔N 扩缩(默认15s同步;默认300s下行稳定窗,可在 behavior 中覆盖)。
  • VPA 👉 收敛 requests/limits(建议先 Initial/Off,稳定后再灰度 Auto)。
  • 整合 👉 KEDA(RabbitMQ QueueLength + MessageRate 双触发)+ HPA behavior(稳收限步)+ VPA(资源画像)+ ABP RateLimiter & Prefetch(削峰防抖)。

1. 背景与目标 🎯

ABP 的后台作业(Volo.Abp.BackgroundJobs.RabbitMQ)在洪峰来临时常瞬时积压。仅靠 CPU/内存型 HPA 会响应滞后。本文给出工程化、可复现的三件套方案:

事件敏感(KEDA) + 放大/收敛可控(HPA) + 资源自适应(VPA) + 端侧防抖(RateLimiter & Prefetch)。


2. 架构与协作机制 🧩

2.1 系统总览(组件与数据流)

Kubernetes Cluster
Namespace: abp-jobs
queue length / msg rate [external]
external metrics → HPA
scale 1..N [resource]
adjust requests/limits
RabbitMQ
KEDA Controller
HPA Controller
Deployment: abp-background-job
Pod
Pod
VPA Recommender/Updater

要点

  • KEDA 轮询 RabbitMQ,生成外部指标供 HPA。
  • HPA 按行为规则完成 1↔N;KEDA 负责 0↔1
  • VPA 仅调 requests/limits,与 HPA(外部指标)解耦。

2.2 0→1 激活 / 1→N 扩缩 时序

ProducerRabbitMQ (Mgmt API)KEDAHPAK8s API ServerPodsPublish messagesFetch queue metricsloop[every pollingInterval(default 30s)]Activate path (> not ≥)Ensure replicas >= 1 (0→1)Expose external metricsScale 1..N (behavior: step/stabilize)Create/adjust Podsloop[HPA sync (default 15s)]Fallback activatedSet replicas = fallback.replicasKeep 0 (cooldown applies)alt[backlog or rate > activationValue][metrics unavailable ≥ failureThreshold][below threshold]ProducerRabbitMQ (Mgmt API)KEDAHPAK8s API ServerPods

2.3 VPA 行为

suggest requests/limits
if mode=Auto or Recreate
if mode=Initial
if mode=Off
new Pod starts with suggested requests/limits
VPA Recommender
VPA Updater
Evict Pod
Deployment creates new Pod

3. 环境基线与安装要点 🧱

  • KEDA(Helm):官方 chart;安装后 KEDA 成为 external metrics 提供者并与 HPA 打通。
  • HPA 控制循环:默认 15s 同步;默认 300s 下行稳定窗(behavior 可覆盖)。
  • RabbitMQ in K8s:推荐 RabbitMQ Cluster Operator;或使用现有 RabbitMQ 并开启 Management API
  • 兼容性:KEDA 与云平台版本映射可能不同,请以平台文档为准。

4. 可复现部署清单 🛠️

命名空间 abp-jobs、Deployment 名 abp-background-job,容器名 app。RabbitMQ 已开 Management API

4.1 安装 KEDA(Helm)

helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda -n keda --create-namespace
kubectl get pods -n keda

4.2 ABP 后台作业 Deployment(节选)

apiVersion: apps/v1
kind: Deployment
metadata:name: abp-background-jobnamespace: abp-jobs
spec:replicas: 1selector:matchLabels: { app: abp-background-job }template:metadata:labels: { app: abp-background-job }spec:containers:- name: appimage: your-registry/abp-job:latestenv:- name: RABBITMQ__Connections__Default__HostNamevalue: "rabbitmq"- name: RABBITMQ__Connections__Default__Portvalue: "5672"- name: RABBITMQ__Connections__Default__UserNamevalueFrom: { secretKeyRef: { name: rmq-auth, key: username } }- name: RABBITMQ__Connections__Default__PasswordvalueFrom: { secretKeyRef: { name: rmq-auth, key: password } }resources:requests: { cpu: "250m", memory: "256Mi" }limits:   { cpu: "1",    memory: "512Mi" }

🔧 ABP Prefetch 与队列前缀可在模块配置中设置(见 §5)。

(可选)创建 rmq-auth Secret(供应用连接 AMQP)
apiVersion: v1
kind: Secret
metadata:name: rmq-authnamespace: abp-jobs
type: Opaque
stringData:username: "user"password: "pass"

4.3 KEDA 认证 & 触发(RabbitMQ:队列长度 + 消息速率)

apiVersion: v1
kind: Secret
metadata:name: keda-rabbitmqnamespace: abp-jobs
type: Opaque
data:# "http://user:pass@rabbitmq:15672/%2f" 的正确 base64host: aHR0cDovL3VzZXI6cGFzc0ByYWJiaXRtcToxNTY3Mi8lMmY=
---
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:name: keda-rmq-authnamespace: abp-jobs
spec:secretTargetRef:- parameter: hostname: keda-rabbitmqkey: host
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:name: abp-background-jobnamespace: abp-jobs
spec:scaleTargetRef:name: abp-background-jobenvSourceContainerName: apppollingInterval: 30cooldownPeriod: 300            # 回 0 的冷却initialCooldownPeriod: 120     # 刚创建时的保护窗口minReplicaCount: 0maxReplicaCount: 50fallback:failureThreshold: 3replicas: 2advanced:horizontalPodAutoscalerConfig:behavior:scaleUp:stabilizationWindowSeconds: 0policies:- type: Percentvalue: 200periodSeconds: 15scaleDown:stabilizationWindowSeconds: 300policies:- type: Percentvalue: 100periodSeconds: 60triggers:# A. QueueLength:控制 backlog/副本- type: rabbitmqmetadata:protocol: httpqueueName: abp-queuemode: QueueLengthvalue: "200"               # 每副本可承载 backlog 目标activationValue: "1"       # 严格 “>” 生效excludeUnacknowledged: "true"authenticationRef:name: keda-rmq-auth# B. MessageRate:控制吞吐/副本(必须 http)- type: rabbitmqmetadata:protocol: httpqueueName: abp-queuemode: MessageRatevalue: "150"               # 每副本目标发布速率(msg/s)activationValue: "5"authenticationRef:name: keda-rmq-auth

📌 不要并行手写同目标 HPA;如需调上/下行行为,直接在 advanced.horizontalPodAutoscalerConfig.behavior 中配置。

4.4 VPA(先 Initial 观测,再灰度 Auto

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:name: abp-background-jobnamespace: abp-jobs
spec:targetRef:apiVersion: apps/v1kind: Deploymentname: abp-background-jobupdatePolicy:updateMode: "Initial"   # 稳定后再切 Auto(会重建)resourcePolicy:containerPolicies:- containerName: appcontrolledResources: ["cpu","memory"]minAllowed: { cpu: "200m", memory: "256Mi" }maxAllowed: { cpu: "2",    memory: "2Gi" }

5. 应用侧防抖:RateLimiter + Prefetch 🛡️

5.1 后台作业可直接复用的 RateLimiter

// Program.cs
using System.Threading.RateLimiting;
using Microsoft.AspNetCore.RateLimiting;builder.Services.AddSingleton<PartitionedRateLimiter<string>>(sp =>PartitionedRateLimiter.Create<string, string>(key =>RateLimitPartition.GetTokenBucketLimiter(partitionKey: key,factory: _ => new TokenBucketRateLimiterOptions {TokenLimit = 200,                 // 突发容量TokensPerPeriod = 200,            // 每秒补充ReplenishmentPeriod = TimeSpan.FromSeconds(1),QueueLimit = 0,QueueProcessingOrder = QueueProcessingOrder.OldestFirst,AutoReplenishment = true}))
);// 可选:同时保护 HTTP 入站入口
builder.Services.AddRateLimiter(options =>
{options.RejectionStatusCode = 429;options.AddPolicy("job-consume",_ => RateLimitPartition.GetTokenBucketLimiter("job-consume",__ => new TokenBucketRateLimiterOptions{TokenLimit = 200,TokensPerPeriod = 200,ReplenishmentPeriod = TimeSpan.FromSeconds(1),QueueLimit = 0,QueueProcessingOrder = QueueProcessingOrder.OldestFirst,AutoReplenishment = true}));
});var app = builder.Build();
app.UseRateLimiter();
// 作业处理(示例)
public class MyJobHandler : IBackgroundJob<MyJobArgs>
{private readonly PartitionedRateLimiter<string> _limiter;public MyJobHandler(PartitionedRateLimiter<string> limiter) => _limiter = limiter;public async Task ExecuteAsync(MyJobArgs args){using var lease = await _limiter.AcquireAsync("job-consume", 1);// 真正处理消息...}
}

5.2 ABP RabbitMQ Prefetch(精确控并发)

// Module.cs 中的配置示例
Configure<AbpRabbitMqBackgroundJobOptions>(opt =>
{opt.DefaultQueueNamePrefix = "myapp_jobs.";opt.PrefetchCount = 8; // 每消费者未确认消息上限
});

6. 压测与验证 🧪

推荐使用官方 RabbitMQ PerfTest 直接“灌队列”,无需第三方扩展。

# 以 1000 msg/s 发布到 abp-queue(按需调整)
docker run --rm pivotalrabbitmq/perf-test:latest \--uri amqp://user:pass@rabbitmq:5672/%2f \--queue abp-queue --rate 1000 --producers 4 --consumers 0

观察要点

  • 空载时保持 replicas=0;当 backlog 或 rate 超过 activationValue0→1 激活;随后 HPA 进入 1→N
  • 停止发布后,观察 300s 冷却期回落到 0
  • 对比不同 PrefetchCount 与启/停 RateLimiter 时的抖动幅度。

7. 误触发与噪声治理 🧭

Frequent wake from 0
Yo-yo scaling
Under-scaling
No scaling
Unexpected scale up/down?
Symptom
Raise activationValue
or set minReplicaCount=1
Increase scaleDown stabilizationWindow
Limit step with policies
Lower target value / verify PerfTest rate
Check KEDA logs
Mgmt API URL & Secret (base64)
Re-test

8. SLO 门槛与监控建议 📈

  • 积压 SLOqueue_ready_messages 5 分钟 P95 ≤ 10k。
  • 时延 SLO:发布→消费端到端延迟 P95 ≤ 2s;若用 MessageRate,关注“消费/发布速率比值”。
  • 伸缩 SLO扩容 TTR ≤ 60s;回落平滑度:每分钟收缩 ≤ 100%(由 HPA policies 限定)。

9. 常见坑与最佳实践 ✅

  • 不要并行手写同目标 HPA:使用 advanced.horizontalPodAutoscalerConfig.behavior 在 ScaledObject 内调行为即可。
  • MessageRate 必须 protocol: httphost 必须包含 vhost(根“/”需编码 %2f)。
  • KEDA 只管 0↔1 + 指标1↔N 频率由 HPA(默认 15s)决定。
  • VPA Auto 会重建:生产建议从 Initial/Off 起步,配 PDB
  • PerfTest 更稳:不依赖已归档扩展,官方工具即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/100364.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/100364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webRTc 为何深受直播实现的青睐?

WebRTC(Web Real-Time Communication)之所以在直播场景中备受青睐,核心原因在于它天然契合了现代直播对低延迟、实时互动、跨平台兼容性的核心需求,同时大幅降低了实时音视频开发的门槛。具体来说,其优势体现在以下几个方面: 1. 超低延迟,满足实时互动需求 传统直播协…

HarmonyOS迷宫游戏鸿蒙应用开发实战:从零构建随机迷宫游戏(初版)

在鸿蒙应用开发中&#xff0c;游戏类应用能很好地锻炼 UI 布局、状态管理与逻辑交互能力。本文将以一个随机迷宫游戏为例&#xff0c;详细拆解从首页设计到迷宫生成、角色控制、通关判定的完整开发流程&#xff0c;带你掌握 ArkUI 框架的核心应用技巧。一、项目整体架构本次开发…

石头科技出海升级:全球电商业财一体化与OMS实践

石头科技作为智能清洁设备领域的独角兽&#xff0c;2023 年海外收入占比超过 60%&#xff0c;产品销往全球 60 多个国家。然而&#xff0c;智能硬件出海的复杂性&#xff0c;让企业在业财管理上面临前所未有的挑战。智能硬件业财痛点 产品生命周期管理&#xff1a;研发、生产到…

《URP管线中后处理效果的创新应用与优化实践》

硬件性能的飞速提升与玩家对画面品质的高要求形成了相互推动的态势,而渲染效果作为游戏视觉体验的核心载体,直接决定了玩家对游戏的第一印象与沉浸感。后处理效果作为URP管线的“点睛之笔”,通过在渲染流程末尾对最终图像进行二次加工,能够模拟真实世界的光学现象(如光线散…

【Java 底层】JVM 垃圾回收机制深度剖析:从对象生死判定到收集器实战

【Java 底层】JVM 垃圾回收机制深度剖析&#xff1a;从对象生死判定到收集器实战 【Java 底层】JVM 垃圾回收机制深度剖析&#xff1a;从对象生死判定到收集器实战 Java 之所以被称为 “开发效率利器”&#xff0c;很大程度上得益于其自动内存管理机制 —— 开发者无需手动分配…

网络问题排查

网络连通性测试&#xff1a;ping ip持续性监测&#xff1a;ping -t ipnetstat 可以查看网络连接状态&#xff0c;可以看到显示系统的网络连接&#xff0c;路由表&#xff0c;接口等信息。netstat -nult 回车-t:显示的是tcp的连接-u:显示udp的连接-l:只显示监听状态的端口-n:显示…

tuple/dict/list 这三个数据类型在取值时候的区别

tuple&#xff08;元组&#xff09;、dict&#xff08;字典&#xff09;、list&#xff08;列表&#xff09;在取值时的区别。 1. list&#xff08;列表&#xff09; &#x1f449; 列表就是“一串有顺序的东西”&#xff0c;像排队的人。 取值方式&#xff1a;用 下标&#xf…

深度解析大模型服务性能评测:AI Ping平台助力开发者精准选型MaaS服务

深度解析大模型服务性能评测&#xff1a;AI Ping平台助力开发者精准选型MaaS服务 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff…

OpenCV物体跟踪:从理论到实战的全面解析

​ 一、引言​ 在计算机视觉的广阔领域中&#xff0c;物体跟踪技术宛如一颗璀璨的明星&#xff0c;散发着独特的魅力与价值&#xff0c;发挥着举足轻重的作用。它致力于在连续的图像帧或视频序列里&#xff0c;精准识别并持续定位特定的目标物体&#xff0c;这一过程看似简单…

【Python】OS模块操作目录

1、概述os模块是一个Python内置的操作目录和查看系统基础信息的模块&#xff0c;可用于让我们对目录进行批量操作&#xff0c;其中包括&#xff1a;查看系统信息&#xff08;环境变量、分隔符、换行符等&#xff09;&#xff0c;对目录进行创建、删除、重命名、查看目录内容等&…

JavaScript中 i++ 与 ++i

在 JavaScript 编程中&#xff0c;i&#xff08;前置自增&#xff09;和i&#xff08;后置自增&#xff09;是两个常用但极易混淆的运算符。它们看似都能实现变量自增 1 的功能&#xff0c;但其执行时机和返回值的差异&#xff0c;常常导致开发者在实际编码中出现逻辑错误。本文…

fastapi 中间件的使用

1. 中间件基础结构from starlette.middleware.base import BaseHTTPMiddlewareclass RequestLoggerMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next):# 1. 请求处理前逻辑# 2. 调用后续处理response await call_next(request)# 3. 响应…

网络白菜包子手动安装 Arch Linux

大家好&#xff01;我是大聪明-PLUS&#xff01;针对初学者的 Arch Linux 安装详细教程。我曾经花了不少时间才搞清楚安装过程。本文旨在提供一种“捷径”&#xff0c;让每个人都能轻松上手&#xff0c;无论他们是否有 Linux 使用经验。Arch 的主要特点是极其灵活的系统配置&am…

Linux学习笔记(五)--Linux基础开发工具使用

在Linux中软件包通常是指一个包含了软件程序、元数据、依赖关系信息和安装脚本的压缩文件​​。因为在Linux上如果没有软件包管理器,那么想要下载软件会非常麻烦,不仅需要自己去手动编译和安装,而且难以卸载和管理,所以软件包的出现解决了这些问题.软件包一般是由程序文件(编译…

数据结构(陈越,何钦铭) 第十讲 排序(下)

10.1 快速排序 10.1.1 算法概述10.1.2 选主元10.1.3 子集划分10.1.4 算法实现10.2 表排序 10.2.1 算法概述10.2.2 物理排序10.3 基数排序 10.3.1 桶排序10.3.2 基数排序10.3.3 多关键字的排序10.4 排序算法的比较

vue 使用print.js 打印文本,HTML元素,图片,PDF

vue 使用print.js 打印文本,HTML元素,图片,PDF 安装 npm install print-js --save示例 <template><div class"print-example"><h2>Print.js 打印示例</h2><!-- 打印区域 --><div id"printableArea" class"printable…

jenkins审批机器人功能概述-Telegram版

Jenkins审批机器人 - 功能概述 代码链接&#xff0c;私聊可得 项目简介 Jenkins审批机器人是一个集成Jenkins CI/CD流程的自动化审批系统&#xff0c;通过Telegram机器人提供便捷的发布审批功能。该系统支持多环境部署审批、用户权限管理、构建结果通知等完整的DevOps审批流程。…

Rust : 关于解引用“*”

关于解引用*操作符&#xff0c;谨供参考&#xff01; 一、主要代码 use std::ops::Deref; fn main() {model_1();model_2();model_3();model_4();model_5();model_6();model_7();model_8();model_9(); }二、*操作符与常见的引用和解引用 fn model_1(){let reference:&St…

【高级终端Termux】在安卓手机/平板上使用Termux 搭建 Debian 环境并运行 PC 级 Linux 应用教程(含安装WPS,VS Code)

Termux 搭建 Debian 环境并运行 PC 级 Linux 应用教程 一、前言 1. 背景 众所周知&#xff0c;最新搭载澎湃OS和鸿蒙OS的平板都内置了PC级WPS&#xff0c;办公效率直接拉满&#xff08;板子终于从“泡面盖”升级为“生产力”了&#xff09;。但问题来了&#xff1a;如果不是这…

从循环到矩阵运算:矢量化加速机器学习的秘诀

矢量化实现全解析&#xff1a;从原理到实战 在学习数据科学、机器学习和深度学习的过程中&#xff0c;我们经常会听到一个高频词——矢量化&#xff08;Vectorization&#xff09;。很多库的官方文档、教程里也不断强调“要尽量使用矢量化操作&#xff0c;而不是显式循环”。那…