ApsaraMQ for RocketMQ を使用する際、メッセージの蓄積によってシステム負荷が高くなる可能性があります。サービスのクラッシュを防ぎ、システムの信頼性と安定性を向上させるために、Kubernetes Event-driven Autoscaling (KEDA) をオートスケーリングソリューションとして使用できます。KEDA を使用すると、ApsaraMQ for RocketMQ のメッセージ蓄積メトリクスに基づいて、自動化された効率的な水平ポッド自動スケーリング (HPA) を実装できます。
背景情報
ApsaraMQ for RocketMQ は、高性能、高信頼性、高スケーラビリティを備えた分散メッセージングミドルウェアであり、エンタープライズアプリケーションで広く使用されています。ただし、特に高負荷時にメッセージの蓄積が発生する可能性があります。これにより、システム負荷が過大になり、サービスのクラッシュを引き起こす可能性もあります。
このシナリオでは、Kubernetes イベント駆動型オートスケーリングツールである KEDA を使用して、カスタムの ApsaraMQ for RocketMQ メッセージ蓄積メトリクスに基づいてアプリケーションの水平ポッド自動スケーリングをトリガーできます。このソリューションにより、自動化された効率的なアプリケーションスケーリングが実現し、システムの信頼性と安定性が向上します。オープンソースの Apache RocketMQ を使用している場合は、Java Management Extensions (JMX) Prometheus Exporter を通じてメッセージデータを公開することで、同様の機能を実現できます。詳細については、Apache RocketMQ コミュニティをご覧ください。
このトピックでは、Managed Service for Prometheus をデータソースとして使用し、ApsaraMQ for RocketMQ と連携する KEDA ScaledObject の設定方法について説明します。
前提条件
ack-keda アドオンがデプロイされていること。詳細については、「イベント駆動型オートスケーリング」をご参照ください。
ApsaraMQ for RocketMQ 5.x インスタンスが作成されていること。詳細については、「インスタンスの作成」をご参照ください。
5.x サーバーレスインスタンスは、ビジネスワークロードに基づいてリソースを迅速にスケールします。リソースは実際の使用量に基づいて割り当てと課金が行われるため、コストを節約できます。詳細については、「5.x サーバーレスインスタンスの概要」をご参照ください。
ARMS コンソールで ApsaraMQ for RocketMQ (5.0) サービスの統合が完了していること。
Go ランタイム環境がインストールされていること。
ステップ 1:ワークロードのデプロイ
この例では、sample-app という名前のサンプル NGINX アプリケーションを使用します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
デプロイメント ページで、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 # これを実際の ApsaraMQ for 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 の設定
ScaledObject YAML ファイルで KEDA スケーリングポリシーを設定します。これらのポリシーには、スケール対象、レプリカの最小数と最大数、およびメッセージの蓄積しきい値などのスケーリングしきい値が含まれます。ScaledObject を設定する前に、ApsaraMQ for RocketMQ インスタンスメトリクスの Prometheus URL を取得する必要があります。
1. ApsaraMQ for RocketMQ コンソールでのインスタンス情報の取得
ApsaraMQ for RocketMQコンソールにログインします。 左側のナビゲーションウィンドウで、インスタンス数 をクリックします。
上部のナビゲーションバーで、中国 (杭州) などのリージョンを選択します。 [インスタンス] ページで、管理するインスタンスの名前をクリックします。
左側のナビゲーションペインで、トピックをクリックします。 右上隅でトピックの名前とインスタンス IDを確認し、記録します。 たとえば、トピック名は
kedaで、インスタンス ID はmq-cn-uax33****です。
2. Prometheus コンソールでの ApsaraMQ for RocketMQ インスタンスの Prometheus データソースの取得
にログインします。 ARMSコンソールを使用します。
左側のナビゲーションウィンドウで、.
対象のインスタンスの Cloud Services-{{RegionId}} をクリックします。 左側のナビゲーションペインで、設定 をクリックし、HTTP API アドレス (Grafana 読み取りアドレス) を記録します。
[パブリックエンドポイント] の URL を使用する必要があります。
3. ScaledObject 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スケール対象のワークロード。 この例では、ステップ 1: ワークロードのデプロイで作成したアプリケーションである
sample-appを設定します。maxReplicaCountスケールアウトする最大レプリカ数。
minReplicaCountスケールインする最小レプリカ数。
serverAddressApsaraMQ for RocketMQ メトリクス用の Prometheus サービスの URL です。以前に記録したHTTP API アドレス (Grafana 読み取りアドレス)を使用します。
metricNamePromQL クエリでリクエストするデータ。
クエリmetricNameの PromQL が要求するデータを集計します。 この例では、集計クエリはメッセージの蓄積のための PromQL です。しきい値スケーリングのしきい値。この例では、メッセージの蓄積数 30 をしきい値として使用します。蓄積数が 30 を超えると、スケールアウトがトリガーされます。
次のコマンドを実行して、ファイルをデプロイし、作成されたリソースを確認します。
# スケーリング設定を適用します。 kubectl apply -f ScaledObject.yaml scaledobject.keda.sh/prometheus-scaledobject created # スケーリング設定のステータスを取得します。 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 # 生成された HPA のステータスを確認します。 kubectl get 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コンソールにログインします。 左側のナビゲーションウィンドウで、インスタンス数 をクリックします。
トップメニューバーで、中国 (杭州) などのリージョンを選択します。インスタンスリストで、目的のインスタンスの名前をクリックして、[エンドポイントとネットワーク情報] を表示して記録します。
左側のナビゲーションペインで、アクセス制御 をクリックします。次に、インテリジェントID認識タブをクリックして、インスタンスのユーザー名とパスワードを表示して記録します。
プロデューサープログラムを実行してデータを生成します。次に、次のコマンドを実行して、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 を RabbitMQ メトリクスと併用して、キューの長さとメッセージレートを監視することもできます。詳細については、「RabbitMQ メトリクスに基づくポッドのオートスケーリング」をご参照ください。