Ao usar o ApsaraMQ for RocketMQ, o acúmulo de mensagens pode elevar excessivamente a carga do sistema e causar interrupções. Use o KEDA (Kubernetes Event-driven Autoscaling) para automatizar o Horizontal Pod Autoscaler (HPA) das suas aplicações com base nas métricas de acúmulo de mensagens do ApsaraMQ for RocketMQ, aumentando a confiabilidade e a estabilidade do sistema.
Contexto
O ApsaraMQ for RocketMQ é um middleware de mensagens distribuído de alto desempenho, alta confiabilidade e grande escalabilidade, amplamente usado em aplicações empresariais. No entanto, o acúmulo de mensagens ocorre facilmente durante o uso do ApsaraMQ for RocketMQ, especialmente sob alta carga. Esse acúmulo pode sobrecarregar o sistema e até mesmo causar indisponibilidade.
Nesse cenário, use a ferramenta de dimensionamento automático orientado a eventos do Kubernetes KEDA para acionar o Horizontal Pod Autoscaler das suas aplicações com base em métricas personalizadas de acúmulo de mensagens do ApsaraMQ for RocketMQ. Essa solução permite dimensionar suas aplicações de forma automática e eficiente, melhorando a confiabilidade e a estabilidade do sistema. Se você usa o Apache RocketMQ open source, também é possível obter funcionalidades semelhantes expondo os dados de mensagens por meio do JMX Prometheus Exporter. Para mais informações, consulte a comunidade Apache RocketMQ.
Este tópico usa o Managed Service for Prometheus como fonte de dados e descreve como configurar o objeto de dimensionamento para o escalonamento baseado em mensagens do ApsaraMQ for RocketMQ.
Pré-requisitos
O add-on ack-keda está implantado. Para mais informações, consulte Event-driven autoscaling.
-
Uma instância da série 5.x do ApsaraMQ for RocketMQ foi criada. Para mais informações, consulte Create an instance.
Uma instância Serverless 5.x escala recursos rapidamente conforme a carga de negócios, permite alocar recursos e calcular taxas com base no uso real, além de reduzir custos de forma eficaz. Para mais informações, consulte 5.x Serverless Series.
O ApsaraMQ for RocketMQ (5.0) service está integrado ao Application Real-Time Monitoring Service (ARMS).
O ambiente de execução Go está instalado.
Etapa 1: Implantar uma carga de trabalho
Este exemplo cria uma aplicação NGINX de amostra chamada sample-app.
Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
Na página Deployments, clique em Create from YAML. Conforme solicitado na página, defina Sample Template como Custom. Use o código de exemplo a seguir para criar uma aplicação NGINX chamada 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"
Etapa 2: Configurar políticas de dimensionamento com um ScaledObject
Configure as políticas de dimensionamento do KEDA em um arquivo YAML ScaledObject, incluindo o alvo do dimensionamento, os números máximo e mínimo de réplicas e o limiar de dimensionamento (limiar de acúmulo de mensagens). Antes de configurar o ScaledObject, obtenha informações como a URL do Prometheus para as métricas da instância do ApsaraMQ for RocketMQ.
1. Obter informações da instância do ApsaraMQ for RocketMQ no console do ApsaraMQ for RocketMQ
Faça login no ApsaraMQ for RocketMQ console. No painel de navegação à esquerda, clique em Instances.
Na barra de navegação superior, selecione uma região, como China (Hangzhou). Na página Instances, clique no nome da instância que deseja gerenciar.
No painel de navegação à esquerda, clique em Topic Management e, em seguida, visualize e anote o valor de Name e o Instance ID no canto superior direito, por exemplo, keda e mq-cn-uax3****.
2. Obter a fonte de dados Prometheus da instância do ApsaraMQ for RocketMQ no console do Managed Service for Prometheus
Faça login no ARMS console.
No painel de navegação à esquerda, escolha .
-
Para a instância alvo, clique em Cloud Services-{{RegionId}}. No painel de navegação à esquerda, clique em Settings e anote o HTTP API Address (Grafana Read Address).
Selecione a URL do Public Endpoint.
3. Criar o arquivo YAML ScaledObject
-
Use o conteúdo a seguir para criar o arquivo ScaledObject.yaml e configurar a política de dimensionamento.
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'A tabela a seguir descreve os parâmetros.
Parâmetro
Descrição
scaleTargetRef.nameO alvo do dimensionamento. Neste exemplo, defina este parâmetro como a aplicação sample-app criada na Etapa 1: Implantar uma carga de trabalho.
maxReplicaCountO número máximo de réplicas para escala horizontal (scale-out).
minReplicaCountO número mínimo de réplicas para redução horizontal (scale-in).
serverAddressA URL do Prometheus que armazena as métricas do ApsaraMQ for RocketMQ, correspondente ao HTTP API Address (Grafana Read Address) anotado anteriormente.
metricNameOs dados solicitados pela consulta PromQL.
queryAgrega os dados solicitados pela consulta PromQL em metricName. Neste exemplo, a agregação corresponde à PromQL para acúmulo de mensagens.
thresholdO limiar de dimensionamento. Este exemplo usa um acúmulo de 30 mensagens como limiar. Uma escala horizontal é acionada quando o acúmulo excede 30.
-
Execute os comandos a seguir para implantar o arquivo e visualizar os recursos criados.
# 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 -
(Opcional) Use um token do Prometheus para aumentar a segurança na leitura de dados e configure a verificação desse token.
Etapa 3: Produzir e consumir dados
Este exemplo usa o projeto rocketmq-keda-sample para produzir e consumir dados. No código do projeto, configure o endpoint, o nome de usuário e a senha da instância do ApsaraMQ for RocketMQ anotados na Etapa 2.
Etapa 4: Acionar scale-out e scale-in produzindo e consumindo dados
Faça login no ApsaraMQ for RocketMQ console. No painel de navegação à esquerda, clique em Instances.
Na barra de menu superior, selecione uma região, como China (Hangzhou). Em seguida, na lista de instâncias, clique no nome da instância alvo para visualizar e anotar as Endpoint and Network Information.
No painel de navegação à esquerda, clique em Access Control. Depois, clique na aba Intelligent Identity Recognition para visualizar e anotar o nome de usuário e a senha da instância.
-
Execute o programa Producer para gerar dados e, em seguida, execute o comando abaixo para verificar o status de dimensionamento do HPA.
kubectl get hpaSaída esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 32700m/30 (avg) 2 10 10 47mA saída esperada indica que a aplicação sample-app realizou scale-out até o número máximo de réplicas configurado para o KEDA.
-
Interrompa o programa Producer, inicie o programa Consumer e execute o comando a seguir para acompanhar o status de dimensionamento do HPA.
kubectl get hpa -wSaída esperada:
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 57mA saída esperada mostra que, algum tempo após o término do consumo de dados, a aplicação sample-app realiza scale-in até o número mínimo de réplicas configurado para o KEDA.
Referências
Também é possível usar o KEDA com base em métricas do RabbitMQ para monitorar o comprimento da fila e a taxa de mensagens. Para mais informações, consulte Autoscale pods based on RabbitMQ metrics.