使用RocketMQ時,訊息堆積產生時容易導致系統負載過高。為避免服務崩潰,提高系統的可靠性和穩定性,您可以基於RocketMQ訊息堆積指標,使用KEDA(Kubernetes Event-driven Autoscaling)為應用的Auto Scaling方案,實現自動化和高效的容器水平伸縮(HPA)。
功能介紹
RocketMQ是一種高效能、高可靠、高擴充性的分布式訊息中介軟體,已被廣泛應用於企業級應用中。但使用RocketMQ時,容易產生訊息堆積的問題,尤其是在高負載情況下。訊息堆積容易導致系統負載過高,甚至導致服務崩潰。
在此情境下,您可以使用Kubernetes事件驅動自動調整工具KEDA,根據自訂的RocketMQ訊息堆積指標,啟動容器水平伸縮應用。此方案可以協助您實現自動化和高效性的應用程式伸縮,從而提高系統的可靠性和穩定性。如果您採用的是開源的RocketMQ,考慮通過JMX的Prometheus Exporter提供訊息對接的資料也可以實作類別似的能力。更多資訊,請參見RocketMQ開源社區。
本文使用阿里雲Prometheus作為資料來源,介紹如何?RocketMQ的訊息對接伸縮對象配置。
前提條件
已部署ack-keda組件,請參見事件驅動彈性。
已建立訊息佇列RocketMQ版5.x系列執行個體,請參見建立執行個體。
5.x的Serverless執行個體能夠根據業務負載快速伸縮資源,支援根據實際的使用量分配資源和計算費用,能夠有效地節約成本。更多資訊,請參見RocketMQ 5.x Serverless執行個體概述。
已在ARMS中接入阿里雲 RocketMQ(5.0) 服務。
步驟一:部署工作負載
本樣本建立一個名為sample-app的Nginx樣本應用。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在無狀態頁面,單擊使用YAML建立資源,按照頁面提示選擇樣本模板為自訂,使用如下範例程式碼建立一個名為sample-app的Nginx應用。
apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: default labels: app: sample-app spec: replicas: 1 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: sample-app # 修改為業務真實的RocketMQ的消費者鏡像。 image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0 resources: limits: cpu: "500m"
步驟二:通過ScaledObject配置伸縮策略
您可以通過ScaledObject YAML檔案配置KEDA的伸縮策略,包括擴縮容的對象、最大最小副本數、擴縮容閾值(訊息堆積量閾值)等。在配置ScaledObject前,您需要擷取RocketMQ執行個體指標資料的Prometheus地址等資訊。
1、在RocketMQ控制台擷取RocketMQ執行個體資訊
登入雲訊息佇列 RocketMQ 版控制台,在左側導覽列單擊執行個體列表。
在頂部功能表列選擇地區,如華東1(杭州),然後在執行個體列表中,單擊目標執行個體名稱。
在左側導覽列,單擊Topic 管理,查看並記錄名稱的值和右上方執行個體 ID,例如:keda、mq-cn-uax33****。
2、在Prometheus控制台擷取RocketMQ執行個體的Prometheus資料來源
登入ARMS控制台。
在左側導覽列選擇,進入可觀測監控 Prometheus 版的執行個體列表頁面。
單擊目標執行個體雲端服務-{{RegionId}},在左側導覽列,單擊設定,記錄HTTP API地址(Grafana 讀取地址)。

3、建立ScaledObject YAML檔案
使用如下內容,建立ScaledObject.yaml,配置伸縮策略。
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: prometheus-scaledobject namespace: default spec: scaleTargetRef: name: sample-app maxReplicaCount: 10 minReplicaCount: 2 triggers: - type: prometheus metadata: serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing metricName: rocketmq_consumer_inflight_messages query: sum({__name__=~"rocketmq_consumer_ready_messages|rocketmq_consumer_inflight_messages",instance_id="rmq-cn-uax3xxxxxx",topic=~"keda"}) by (consumer_group) threshold: '30'參數說明如下。
參數
說明
scaleTargetRef.name配置擴縮容的對象,這裡配置步驟一:部署工作負載建立好的應用sample-app。
maxReplicaCount擴容的最大副本數。
minReplicaCount縮容的最小副本數。
serverAddress配置儲存RocketMQ指標資料的Prometheus地址,即上文記錄的HTTP API地址(Grafana 讀取地址)。
metricNamePromQL請求資料。
query對metricName中PromQL請求的資料做彙總操作,此處彙總方式為訊息堆積量的PromQL。
threshold擴縮容的閾值。本樣本將訊息堆積量30作為閾值,超過30時會觸發擴容。
執行如下命令,部署檔案並查看建立的資源。
# 下發伸縮配置。 kubectl apply -f ScaledObject.yaml scaledobject.keda.sh/prometheus-scaledobject created # 擷取伸縮配置狀態。 kubectl get ScaledObject NAME SCALETARGETKIND SCALETARGETNAME MIN MAX TRIGGERS AUTHENTICATION READY ACTIVE FALLBACK AGE prometheus-scaledobject apps/v1.Deployment sample-app 2 10 prometheus True False False 105s # 檢查HPA的產生情況。 kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 0/30 (avg) 2 10 2 28m(可選)使用Prometheus Token以提高資料讀取的安全性,並配置Prometheus Token的驗證。
步驟三:生產和消費資料
本樣本使用rocketmq-keda-sample專案生產和消費資料,請在專案代碼中配置步驟二中記錄的RocketMQ執行個體的地址、使用者名稱、密碼。
步驟四:使用生產和消費資料實現擴縮容
登入雲訊息佇列 RocketMQ 版控制台,在左側導覽列單擊執行個體列表。
在頂部功能表列選擇地區,如華東1(杭州),然後在執行個體列表中,單擊目標執行個體名稱,查看並記錄存取點和網路資訊。
在左側導覽列,單擊存取控制,然後單擊智能身份識別頁簽,查看並記錄執行個體使用者名稱和執行個體密碼。
運行Producer程式生產資料,然後執行如下命令,查看HPA伸縮情況。
kubectl get hpa預期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 32700m/30 (avg) 2 10 10 47m預期輸出表明,sample-app應用已經擴容到KEDA組件設定的最大副本數。
關閉Producer程式,運行Consumer程式,然後執行如下命令,查看HPA伸縮情況。
kubectl get hpa -w預期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 222500m/30 (avg) 2 10 10 50m keda-hpa-prometheus-scaledobject Deployment/sample-app 232400m/30 (avg) 2 10 10 51m keda-hpa-prometheus-scaledobject Deployment/sample-app 0/30 (avg) 2 10 10 52m keda-hpa-prometheus-scaledobject Deployment/sample-app 0/30 (avg) 2 10 2 57m預期輸出表明,在資料消費結束一段時間後,sample-app應用縮容至KEDA組件設定的最小副本數。
相關文檔
您也可以實現基於RabbitMQ指標的KEDA,監控隊列長度和訊息速率指標,請參見基於RabbitMQ指標的容器水平伸縮。
