ApsaraMQ for RocketMQを使用すると、メッセージの蓄積によりシステム負荷が高くなることがあります。 サービスの中断を防ぎ、システムの信頼性と安定性を向上させるために、Kubernetesイベントドリブン自動スケーリング (KEDA) を使用して、ApsaraMQ for RocketMQのメッセージ蓄積メトリックに基づいて水平ポッド自動スケーリングを自動化できます。
関数の説明
ApsaraMQ for RocketMQは、高いパフォーマンス、高い信頼性、高いスケーラビリティを備えた分散メッセージングミドルウェアサービスとして、エンタープライズクラスのアプリケーションに広く採用されています。 ApsaraMQ for RocketMQを使用すると、特に負荷が高い場合にメッセージが蓄積されることがあります。 これにより、システム負荷がさらに増加し、アプリケーションの故障を引き起こす可能性があります。
この問題を解決するには、KEDAを使用して、ApsaraMQ for RocketMQのカスタムメッセージ蓄積メトリックに基づいて、アプリケーションの水平ポッド自動スケーリングを有効にします。 KEDAは、メッセージ蓄積メトリックに基づいてアプリケーションを高効率で自動的にスケーリングできます。 これにより、システムの信頼性と安定性が保証されます。 オープンソースのApache RocketMQを使用している場合は、Java Management Extensions (JMX) Prometheus exporterによって収集されたメトリックに基づいて、水平ポッドの自動スケーリングを有効にできます。 詳細については、「Apache RocketMQ」をご参照ください。
このトピックでは、Managed Service for Prometheusをデータソースとして使用するRocketMQメッセージドッキングスケーリングオブジェクトの構成について詳しく説明します。
前提条件
ack-kedaコンポーネントが展開されます。 詳細については、「ACK KEDA」をご参照ください。
ApsaraMQ for RocketMQ 5.xインスタンスが作成されました。 詳細は、インスタンスの作成をご参照ください。
サーバーレスApsaraMQ for RocketMQ 5.xインスタンスは、ビジネスワークロードに基づく迅速なリソーススケーリングをサポートしています。 コストを削減するために、リソースが割り当てられ、実際の使用量に応じてコンピューティング料金が請求されます。 詳細については、「Serverless ApsaraMQ For RocketMQ 5.xインスタンスの概要」をご参照ください。
ステップ1: アプリケーションのデプロイ
この例では、sample-appという名前のNGINXアプリケーションが作成されます。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[デプロイメント] ページで、[YAMLから作成] をクリックします。 [作成] ページで、[サンプルテンプレート] を [カスタム] に設定し、次の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 image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0 // Change to the actual RocketMQ consumer image. resources: limits: cpu: "500m"
手順2: ScaledObjectを使用したスケーリングポリシーの設定
ScaledObject YAMLファイルを使用してKEDAスケーリングポリシーを設定します。このファイルには、スケーリングオブジェクト、最大レプリカと最小レプリカ、およびメッセージ累積しきい値などのスケーリングしきい値が含まれます。 ScaledObjectを設定する前に、ApsaraMQ for RocketMQインスタンスメトリックのPrometheusアドレスおよびその他の関連情報を取得します。
1。 ApsaraMQ for RocketMQコンソールからのインスタンス情報の取得
ApsaraMQ for RocketMQコンソールにログインします。 左側のナビゲーションウィンドウで、インスタンス数 をクリックします。
上部のナビゲーションバーで、中国 (杭州) などのリージョンを選択します。 [インスタンス] ページで、管理するインスタンスの名前をクリックします。
左側のナビゲーションウィンドウで、[トピック] をクリックし、右上隅に [名前] と [インスタンスID] (それぞれkedaとmq-cn-uax33 **** など) を記録します。
2. PrometheusコンソールでApsaraMQ for RocketMQインスタンスのPrometheusデータソースを取得する
にログインします。 ARMSコンソールを使用します。
左側のナビゲーションウィンドウで、 .
cloud-product-prometheus _{{ RegionId}} という名前のインスタンスを見つけて、その名前をクリックします。 左側のウィンドウで、[設定] をクリックします。 [Cloud Service: rocketmq] をクリックし、[HTTP APIアドレス (Grafana読み取りアドレス)] セクションにエンドポイントをコピーします。
3。 ScaledObject YAMLファイルの作成
次の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に設定されます。これは、手順1: アプリケーションのデプロイで作成したアプリケーションの名前です。
maxReplicaCount
スケールアウト操作中に維持するレプリカの最大数。
minReplicaCount
スケールイン操作中に維持するレプリカの最小数。
serverAddress
ApsaraMQ for RocketMQインスタンスのメトリックを格納するPrometheusインスタンスのエンドポイント。 この例では、値は、前の手順でHTTP APIアドレス (Grafana読み取りアドレス) からコピーしたエンドポイントに設定されます。
metricName
Prometheus Query Language (PromQL) クエリデータ。
query
metricNameパラメーターで指定されたPromQLクエリデータを集計します。 この例では、蓄積されたメッセージの数の統計が集約される。
しきい値
スケーリングしきい値。 この例では、スケーリングしきい値は30です。これは、蓄積されたメッセージの数が30を超えると、アプリケーションがスケールアウトされることを示します。
次のコマンドを実行してScaledObject.yamlファイルをデプロイし、作成されたリソースを確認します。
# Apply the scaling configuration. kubectl apply -f ScaledObject.yaml # The following output indicates successful creation. scaledobject.keda.sh/prometheus-scaledobject created # Retrieve the status of the scaling configuration. kubectl get ScaledObject # Output showing the ScaledObject details. 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 a Horizontal Pod Autoscaler (HPA) is created to scale the application. kubectl get hpa # Output showing the HPA status. NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 0/30 (avg) 2 10 2 28m
(オプション) 読み取り操作のデータセキュリティを向上させるには、認証にPrometheusトークンを使用します。
ステップ3: データの生成と消費
この例では、rocketmq-keda-sampleプロジェクトがデータを生成および消費します。 プロジェクトのコードでは、手順2で取得したApsaraMQ for RocketMQインスタンスのエンドポイント、ユーザー名、およびパスワードを指定する必要があります。
ステップ4: 生成および消費されたデータを使用してアプリケーションのスケーリングをトリガーする
ApsaraMQ for RocketMQコンソールにログインします。 左側のナビゲーションウィンドウで、インスタンス数 をクリックします。
上部のナビゲーションバーで、中国 (杭州) などのリージョンを選択します。 [インスタンス] ページで、管理するインスタンスの名前をクリックし、[エンドポイントとネットワーク情報] を記録します。
左側のナビゲーションウィンドウで、[アクセス制御] をクリックし、[インテリジェント認証] タブをクリックして、ユーザー名とパスワードを記録します。
プロデューサープログラムを実行してデータを生成し、次のコマンドを実行して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で指定された最大値にスケーリングされていることを示します。
プロデューサープログラムを停止し、コンシューマープログラムを実行します。 次に、次のコマンドを実行して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で指定された最小値に縮小されることを示しています。
関連ドキュメント
ApsaraMQ for RabbitMQメトリックでKEDAを使用して、ポッドの水平自動スケーリングを自動化し、キューの長さとメッセージング速度を監視できます。 詳細については、「RabbitMQのMessage Queueのメトリックに基づく水平ポッドの自動スケーリング」をご参照ください。