Ketika backlog pesan menumpuk di ApsaraMQ for RocketMQ, pod konsumen dapat tertinggal, sehingga meningkatkan beban sistem dan berisiko mengganggu layanan. Gunakan Kubernetes Event-Driven Autoscaling (KEDA) untuk secara otomatis menskala pod konsumen berdasarkan metrik backlog pesan real-time, sehingga kapasitas menyesuaikan permintaan tanpa intervensi manual.
Cara kerja
KEDA menskala pod konsumen dalam dua fase berbeda:
Fase aktivasi (0 hingga 1 replika): KEDA memantau metrik backlog pesan secara langsung. Ketika backlog melebihi ambang batas aktivasi, KEDA menskala Penyebaran dari nol menjadi satu replika.
Fase penskalaan (1 hingga N replika): Setelah setidaknya satu replika berjalan, Kubernetes Horizontal Pod Autoscaler (HPA) mengambil alih dan menyesuaikan jumlah replika berdasarkan metrik yang diekspos oleh KEDA. Oleh karena itu,
kubectl get hpamenampilkan resource HPA yang dikelola KEDA setelah Anda menerapkan ScaledObject.
Untuk ApsaraMQ for RocketMQ, KEDA menggunakan Managed Service for Prometheus sebagai sumber metrik. Parameter threshold dalam ScaledObject merepresentasikan target backlog pesan per replika. Sebagai contoh, jika setiap pod konsumen dapat memproses 30 pesan, atur threshold: '30'. Dengan 90 pesan terakumulasi, KEDA akan menskala menjadi 3 replika.
Jika Anda menggunakan Apache RocketMQ open-source, Anda dapat mengaktifkan penyesuaian otomatis pod horizontal berdasarkan metrik yang dikumpulkan oleh Java Management Extensions (JMX) Prometheus exporter. Untuk informasi lebih lanjut, lihat Apache RocketMQ.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Mendeploy komponen ack-keda. Untuk informasi lebih lanjut, lihat Penyesuaian otomatis berbasis peristiwa.
Membuat instans ApsaraMQ for RocketMQ 5.x. Untuk informasi lebih lanjut, lihat Buat instans.
Instans ApsaraMQ for RocketMQ 5.x Serverless mendukung penskalaan sumber daya cepat berdasarkan beban kerja bisnis, dengan biaya komputasi ditagih sesuai penggunaan aktual. Untuk informasi lebih lanjut, lihat Ikhtisar instans ApsaraMQ for RocketMQ 5.x Serverless.
Layanan Aliyun RocketMQ (5.0) telah terintegrasi di konsol ARMS.
Mengonfigurasi lingkungan runtime Go.
Langkah 1: Deploy aplikasi
Langkah ini membuat Penyebaran NGINX bernama sample-app sebagai target penskalaan.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster yang ingin Anda kelola. Di panel kiri, pilih Workloads > Deployments.
Di halaman Deployments, klik Create from YAML. Di halaman Create, atur Sample Template ke Custom, lalu terapkan YAML berikut:
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 # Ganti dengan gambar kontainer konsumen RocketMQ aktual Anda. 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"
Langkah 2: Konfigurasikan kebijakan penskalaan melalui ScaledObject
ScaledObject mendefinisikan target penskalaan, batas replika, dan kueri Prometheus yang mendorong keputusan penskalaan. Sebelum membuat ScaledObject, kumpulkan endpoint Prometheus dan detail instans dari konsol ApsaraMQ for RocketMQ serta konsol ARMS.
Kumpulkan informasi instans dari konsol ApsaraMQ for RocketMQ
Masuk ke Konsol ApsaraMQ for RocketMQ. Di panel navigasi kiri, klik Instances.
Di bilah navigasi atas, pilih wilayah, misalnya China (Hangzhou). Di halaman Instances, klik nama instans yang ingin Anda kelola.
Di panel navigasi kiri, klik Topics. Catat Name topik dan Instance ID yang ditampilkan di pojok kanan atas—misalnya,
kedadanmq-cn-uax33****.
Dapatkan endpoint Prometheus untuk instans ApsaraMQ for RocketMQ
Masuk ke Konsol ARMS.
Di panel navigasi kiri, pilih Managed Service for Prometheus > Instances.
Temukan instans bernama Cloud Services-{{RegionId}}, lalu klik namanya. Di panel kiri, klik Settings, lalu salin endpoint dari bagian HTTP API URL (Grafana Read URL).

Buat ScaledObject
Buat file bernama
ScaledObject.yamldengan konten berikut:Parameter Deskripsi scaleTargetRef.namePenyebaran yang akan diskala. Pada contoh ini, sample-app(dibuat pada Langkah 1).maxReplicaCountJumlah maksimum replika yang diizinkan saat scale out. minReplicaCountJumlah minimum replika yang dipertahankan saat scale in. serverAddressEndpoint Prometheus yang menyimpan metrik ApsaraMQ for RocketMQ. Gunakan endpoint yang disalin dari HTTP API URL (Grafana Read URL) pada langkah sebelumnya. metricNameNama metrik PromQL yang digunakan sebagai sinyal penskalaan. queryKueri PromQL yang mengagregasi backlog pesan di seluruh instans dan topik yang ditentukan, dikelompokkan berdasarkan kelompok konsumen. thresholdTarget backlog pesan per replika (AverageValue). KEDA menskala Penyebaran sehingga setiap replika menangani tidak lebih dari jumlah pesan tersebut rata-rata. Untuk menentukan nilai ini, perkirakan jumlah pesan yang dapat diproses oleh satu pod konsumen, lalu gunakan angka tersebut sebagai ambang batas. apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: prometheus-scaledobject namespace: default spec: scaleTargetRef: name: sample-app # Wajib. Penyebaran yang akan diskala. maxReplicaCount: 10 # Wajib. Replika maksimum saat scale out. minReplicaCount: 2 # Wajib. Replika minimum saat scale in. triggers: - type: prometheus metadata: # Field wajib: serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing # Ganti serverAddress dengan endpoint yang disalin dari konsol ARMS. 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) # Ganti instance_id dan topic dengan ID instans dan nama topik aktual Anda. threshold: '30' # Target backlog pesan per replika (AverageValue). # Contoh: jika satu pod menangani 30 pesan, # 90 pesan terakumulasi menskala menjadi 3 replika.Tabel berikut menjelaskan parameter utama:
Terapkan ScaledObject dan verifikasi resource yang dibuat:
# Terapkan konfigurasi penskalaan. kubectl apply -f ScaledObject.yaml # Verifikasi ScaledObject siap digunakan. kubectl get ScaledObjectOutput yang diharapkan:
NAME SCALETARGETKIND SCALETARGETNAME MIN MAX TRIGGERS AUTHENTICATION READY ACTIVE FALLBACK AGE prometheus-scaledobject apps/v1.Deployment sample-app 2 10 prometheus True False False 105sKEDA secara otomatis membuat HPA untuk Penyebaran tersebut. Konfirmasi keberadaannya:
kubectl get hpaOutput yang diharapkan:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 0/30 (avg) 2 10 2 28m(Opsional) Untuk mengamankan akses baca ke Prometheus, konfigurasikan autentikasi berbasis token. Klik untuk melihat langkah-langkah detail
Hasilkan token Prometheus seperti yang diminta di halaman tersebut.

Buat Secret dengan nilai Base64-encoded untuk field
customAuthHeaderdancustomAuthValue:apiVersion: v1 kind: Secret metadata: name: keda-prom-secret namespace: default data: customAuthHeader: "QXV0Xxxxxxxlvbg==" customAuthValue: "kR2tpT2lJeFpXSmxaVFV6WlMTxxxxxxxxRMVFE0TUdRdE9USXpaQzFqWkRZd09EZ3dOVFV5WWpZaWZRLjlDaFBYU0Q2dEhWc1dQaFlyMGh3ZU5FQjZQZWVETXFjTlYydVNqOU82TTQ="Buat resource TriggerAuthentication yang mereferensikan Secret tersebut:
apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: keda-prom-creds namespace: default spec: secretTargetRef: - parameter: customAuthHeader name: keda-prom-secret key: customAuthHeader - parameter: customAuthValue name: keda-prom-secret key: customAuthValuePerbarui ScaledObject untuk mereferensikan TriggerAuthentication:
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' authModes: "custom" authenticationRef: name: keda-prom-creds # Mereferensikan TriggerAuthentication yang dibuat di atas.Catatan: Contoh ini menggunakan autentikasi kustom. Untuk metode autentikasi lain yang didukung oleh scaler Prometheus, lihat dokumentasi komunitas KEDA.
Langkah 3: Produksi dan konsumsi data
Gunakan proyek rocketmq-keda-sample untuk memproduksi dan mengonsumsi pesan. Dalam kode proyek, tentukan endpoint, username, dan password instans ApsaraMQ for RocketMQ yang diperoleh pada Langkah 2.
Langkah 4: Verifikasi perilaku autoscaling
Masuk ke Konsol ApsaraMQ for RocketMQ. Di panel navigasi kiri, klik Instances.
Di bilah navigasi atas, pilih wilayah, misalnya China (Hangzhou). Di halaman Instances, klik nama instans yang ingin Anda kelola. Catat Endpoint and Network Information.
Di panel navigasi kiri, klik Access Control, lalu klik tab Intelligent Authentication. Catat username dan password.
Jalankan program produsen untuk menerbitkan pesan, lalu periksa status HPA:
kubectl get hpaOutput yang diharapkan:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 32700m/30 (avg) 2 10 10 47mREPLICASmenunjukkan bahwasample-apptelah diskala ke jumlah replika maksimum yang dikonfigurasi dalam ScaledObject.Hentikan program produsen dan jalankan program konsumen. Amati HPA melakukan scale in saat backlog terhapus:
kubectl get hpa -wOutput yang diharapkan:
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 57mSetelah semua pesan dikonsumsi,
REPLICASkembali ke jumlah replika minimum (minReplicaCount: 2).
Langkah berikutnya
Skala pod berdasarkan panjang antrian dan laju pesan menggunakan metrik ApsaraMQ for RabbitMQ. Untuk informasi lebih lanjut, lihat Penyesuaian otomatis pod horizontal berdasarkan metrik ApsaraMQ for RabbitMQ.