Lorsque vous utilisez ApsaraMQ for RocketMQ, l'accumulation de messages peut entraîner une charge système excessive et provoquer des pannes. Utilisez KEDA (Kubernetes Event-driven Autoscaling) pour automatiser le Horizontal Pod Autoscaler (HPA) de vos applications en fonction des métriques d'accumulation de messages ApsaraMQ for RocketMQ, ce qui améliore la fiabilité et la stabilité du système.
Contexte
ApsaraMQ for RocketMQ est un middleware de messagerie distribué haute performance, hautement fiable et évolutif, largement utilisé dans les applications d'entreprise. Toutefois, l'accumulation de messages survient facilement lors de l'utilisation d'ApsaraMQ for RocketMQ, en particulier sous forte charge. Cette accumulation peut faire grimper la charge système à des niveaux critiques, voire provoquer des pannes.
Dans cette situation, utilisez l'outil de mise à l'échelle pilotée par les événements Kubernetes KEDA pour déclencher le Horizontal Pod Autoscaler de vos applications en fonction de métriques personnalisées d'accumulation de messages ApsaraMQ for RocketMQ. Cette solution met automatiquement et efficacement vos applications à l'échelle, améliorant ainsi la fiabilité et la stabilité du système. Si vous utilisez Apache RocketMQ open source, vous pouvez également obtenir des capacités similaires en exposant les données de messages via le JMX Prometheus Exporter. Pour plus d'informations, consultez la communauté Apache RocketMQ.
Cette rubrique utilise Managed Service for Prometheus comme source de données et décrit comment configurer l'objet de mise à l'échelle pour une mise à l'échelle basée sur les messages ApsaraMQ for RocketMQ.
Prérequis
Le module complémentaire ack-keda est déployé. Pour plus d'informations, consultez Mise à l'échelle pilotée par les événements.
-
Une instance de la série ApsaraMQ for RocketMQ 5.x est créée. Pour plus d'informations, consultez Créer une instance.
Une instance Serverless 5.x permet de mettre à l'échelle rapidement les ressources en fonction de la charge métier, prend en charge l'allocation des ressources et la facturation selon l'utilisation réelle, et peut réduire efficacement les coûts. Pour plus d'informations, consultez Série Serverless 5.x.
Le service ApsaraMQ for RocketMQ (5,0) est intégré à Application Real-Time Monitoring Service (ARMS).
L'environnement d'exécution Go est installé.
Étape 1 : Déployer une charge de travail
Cet exemple crée une application NGINX d'exemple nommée sample-app.
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur .
-
Sur la page Deployments, cliquez sur Create from YAML. Selon les instructions affichées à l'écran, définissez Sample Template sur Custom. Utilisez l'exemple de code suivant pour créer une application NGINX nommée sample-app.
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 # Replace this with the image of your actual ApsaraMQ for RocketMQ consumer. 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"
Étape 2 : Configurer les politiques de mise à l'échelle avec un ScaledObject
Configurez les politiques de mise à l'échelle KEDA dans un fichier YAML ScaledObject, y compris la cible de mise à l'échelle, le nombre maximal et minimal de réplicas, ainsi que le seuil de mise à l'échelle (seuil d'accumulation de messages). Avant de configurer le ScaledObject, obtenez des informations telles que l'URL Prometheus des métriques de l'instance ApsaraMQ for RocketMQ.
1. Obtenir les informations de l'instance ApsaraMQ for RocketMQ dans la console ApsaraMQ for RocketMQ
Connectez-vous à la console ApsaraMQ for RocketMQ. Dans le volet de navigation de gauche, cliquez sur Instances.
Dans la barre de navigation supérieure, sélectionnez une région, par exemple China (Hangzhou). Sur la page Instances, cliquez sur le nom de l'instance que vous souhaitez gérer.
Dans le volet de navigation de gauche, cliquez sur Topic Management, puis affichez et notez la valeur de Name et l'Instance ID dans le coin supérieur droit, par exemple keda et mq-cn-uax33****.
2. Obtenir la source de données Prometheus de l'instance ApsaraMQ for RocketMQ dans la console Managed Service for Prometheus
Connectez-vous à la console ARMS.
Dans le volet de navigation de gauche, choisissez .
-
Pour l'instance cible, cliquez sur Cloud Services-{{RegionId}}. Dans le volet de navigation de gauche, cliquez sur Settings, puis notez l'HTTP API Address (Grafana Read Address).
Sélectionnez l'URL du Public Endpoint.
3. Créer le fichier YAML ScaledObject
-
Utilisez le contenu suivant pour créer ScaledObject.yaml et configurer la politique de mise à l'échelle.
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'Le tableau suivant décrit les paramètres.
Parameter
Description
scaleTargetRef.nameLa cible de mise à l'échelle. Dans cet exemple, définissez ce paramètre sur l'application sample-app que vous avez créée à l'Étape 1 : Déployer une charge de travail.
maxReplicaCountLe nombre maximal de réplicas vers lesquels effectuer la mise à l'échelle horizontale.
minReplicaCountLe nombre minimal de réplicas vers lesquels effectuer la réduction.
serverAddressL'URL Prometheus qui stocke les métriques ApsaraMQ for RocketMQ, correspondant à l'HTTP API Address (Grafana Read Address) que vous avez notée précédemment.
metricNameLes données demandées par la requête PromQL.
queryAgrège les données demandées par la requête PromQL dans metricName. Dans cet exemple, l'agrégation correspond au PromQL pour l'accumulation de messages.
thresholdLe seuil de mise à l'échelle. Cet exemple utilise une accumulation de messages de 30 comme seuil. Une mise à l'échelle horizontale est déclenchée lorsque l'accumulation dépasse 30.
-
Exécutez les commandes suivantes pour déployer le fichier et afficher les ressources créées.
# Apply the scaling configuration. kubectl apply -f ScaledObject.yaml scaledobject.keda.sh/prometheus-scaledobject created # Get the status of the scaling configuration. 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 # Check whether the HPA is generated. kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 0/30 (avg) 2 10 2 28m -
(Facultatif) Utilisez un jeton Prometheus pour améliorer la sécurité des lectures de données et configurez la vérification du jeton Prometheus.
Étape 3 : Produire et consommer des données
Cet exemple utilise le projet rocketmq-keda-sample pour produire et consommer des données. Dans le code du projet, configurez le point de terminaison, le nom d'utilisateur et le mot de passe de l'instance ApsaraMQ for RocketMQ que vous avez notés à l'Étape 2.
Étape 4 : Déclencher la mise à l'échelle horizontale et la réduction en produisant et consommant des données
Connectez-vous à la console ApsaraMQ for RocketMQ. Dans le volet de navigation de gauche, cliquez sur Instances.
Dans la barre de menu supérieure, sélectionnez une région, par exemple China (Hangzhou). Ensuite, dans la liste des instances, cliquez sur le nom de l'instance cible pour afficher et noter les Endpoint and Network Information.
Dans le volet de navigation de gauche, cliquez sur Access Control. Ensuite, cliquez sur l'onglet Intelligent Identity Recognition pour afficher et noter le nom d'utilisateur et le mot de passe de l'instance.
-
Exécutez le programme Producer pour produire des données, puis exécutez la commande suivante pour afficher l'état de mise à l'échelle du HPA.
kubectl get hpaSortie attendue :
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 32700m/30 (avg) 2 10 10 47mLa sortie attendue indique que l'application sample-app a été mise à l'échelle horizontalement jusqu'au nombre maximal de réplicas configuré pour KEDA.
-
Arrêtez le programme Producer, exécutez le programme Consumer, puis exécutez la commande suivante pour afficher l'état de mise à l'échelle du HPA.
kubectl get hpa -wSortie attendue :
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 57mLa sortie attendue indique qu'un certain temps après la fin de la consommation des données, l'application sample-app revient au nombre minimal de réplicas configuré pour KEDA.
Références
Vous pouvez également utiliser KEDA basé sur les métriques RabbitMQ pour surveiller la longueur de la file d'attente et les métriques de taux de messages. Pour plus d'informations, consultez Mettre à l'échelle automatiquement les pods en fonction des métriques RabbitMQ.