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
英文地址,請注明出處:http://en.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;而不是顯式循環”。那…