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 エクスポーターによって収集されたメトリックに基づいて水平ポッド自動スケーリングを有効にすることができます。 詳細については、「Apache RocketMQ」をご参照ください。
このトピックでは、Managed Service for Prometheus をデータソースとして使用した RocketMQ メッセージドッキングスケーリングオブジェクトの構成について詳しく説明します。
前提条件
ack-keda コンポーネントがデプロイされていること。 詳細については、「イベント駆動型自動スケーリング」をご参照ください。
ApsaraMQ for RocketMQ 5.x インスタンスが作成されていること。 詳細については、「インスタンスの作成」をご参照ください。
サーバーレス ApsaraMQ for RocketMQ 5.x インスタンスは、ビジネスワークロードに基づいた迅速なリソーススケーリングをサポートしています。 コストを削減するために、リソースは実際の使用状況に応じて割り当てられ、コンピューティング料金が課金されます。 詳細については、「サーバーレス ApsaraMQ for RocketMQ 5.x インスタンスの概要」をご参照ください。
ARMS コンソールに Aliyun RocketMQ (5.0) サービスが統合されていること。
Go ランタイム環境が構成されていること。
ステップ 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 # 実際の 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"
ステップ 2: ScaledObject を使用してスケーリングポリシーを構成する
KEDA スケーリングポリシーを ScaledObject YAML ファイルを使用して構成します。これには、スケーリングオブジェクト、最大レプリカ数と最小レプリカ数、およびメッセージ累積しきい値などのスケーリングしきい値が含まれます。 ScaledObject を構成する前に、Prometheus アドレスと ApsaraMQ for RocketMQ インスタンスメトリックのその他の関連情報を取得します。
1. ApsaraMQ for RocketMQ コンソールからインスタンス情報を取得する
ApsaraMQ for RocketMQ コンソール にログインします。 左側のナビゲーションウィンドウで、インスタンス数 をクリックします。
上部のナビゲーションバーで、中国 (杭州) などのリージョンを選択します。 [インスタンス] ページで、管理するインスタンスの名前をクリックします。
左側のナビゲーションウィンドウで、[トピック] をクリックし、右上隅にある [名前] と [インスタンス ID] (例: それぞれ keda と mq-cn-uax33****) を記録します。
2. Prometheus コンソールで ApsaraMQ for RocketMQ インスタンスの Prometheus データソースを取得する
ARMS コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
[クラウドサービス-{{RegionId}}] という名前のインスタンスを見つけて、その名前をクリックします。 左側のウィンドウで、[設定] をクリックし、[HTTP API URL (Grafana 読み取り URL)] セクションのエンドポイントをコピーします。

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スケールイン操作中に維持するレプリカの最小数。
serverAddressApsaraMQ for RocketMQ インスタンスのメトリックを格納する Prometheus インスタンスのエンドポイント。 この例では、値は前のステップで [HTTP API アドレス (Grafana 読み取りアドレス)] からコピーしたエンドポイントに設定されています。
metricNamePrometheus Query Language (PromQL) クエリデータ。
querymetricName パラメーターで指定された PromQL クエリデータを集計します。 この例では、累積メッセージ数の統計が集計されます。
thresholdスケーリングしきい値。 この例では、スケーリングしきい値は 30 です。これは、累積メッセージ数が 30 を超えるとアプリケーションがスケールアウトされることを示します。
次のコマンドを実行して ScaledObject.yaml ファイルをデプロイし、作成されたリソースを確認します。
# スケーリング構成を適用します。 kubectl apply -f ScaledObject.yaml # 次の出力は、作成が成功したことを示します。 scaledobject.keda.sh/prometheus-scaledobject created # スケーリング構成のステータスを取得します。 kubectl get ScaledObject # 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 # アプリケーションをスケーリングするために Horizontal Pod Autoscaler (HPA) が作成されているかどうかを確認します。 kubectl get hpa # HPA ステータスを示す出力。 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 で指定された最小値にスケールダウンされたことを示しています。
参考資料
KEDA を ApsaraMQ for RabbitMQ メトリックと共に使用して、水平ポッド自動スケーリングを自動化し、キューの長さとメッセージングレートを監視できます。 詳細については、「ApsaraMQ for RabbitMQ のメトリックに基づく水平ポッド自動スケーリング」をご参照ください。
