Azure Container Apps (KEDA) で Redis の状況に合わせてスケールさせる
Azure Container Apps にて Redis の溜まり具合に応じてインスタンス数を調整する記事が出ており、興味があったので試してみました。
環境・準備
- Azure Container Apps
- Azure Cache for Redis (v6)
Azure Container Apps
下記の公式チュートリアルを参考にデプロイしておきます。
Azure Cache for Redis
下記の公式チュートリアルを参考にデプロイしておきます。
なお、Redis のバージョンは 6 で、TLS を使わないアクセスを許可しておきます。
Redis の作成完了後、ポータル上 Redis の「概要」から「コンソール」に入り、下記のコマンドを実行してストリームとコンシューマーグループを作成しておきます。
XGROUP CREATE mystream mygroup $ mkstream
Container Apps のスケール設定を行う
まず、Redis 側でアクセスキーを取得しておきます。
次に Container Apps 側で「シークレット」に移動し、先ほどのアクセスキーを redis-connection-string
という名前で登録しておきます。
そして、Container Apps の「Scale and replicas」から新しいリビジョンを作成します。スケーリングのスケールルールの設定箇所にて、下記のように設定します。
設定箇所 | 値 |
---|---|
ルール名 | 任意 |
種類 | カスタム |
カスタムルールの種類 | redis-streams |
シークレットの参照 | redis-connection-string |
トリガーパラメーター | password |
メタデータの箇所を下記のように設定し、「追加」および「作成」をクリックします。
設定箇所 | 値 |
---|---|
consumerGroup | mygroup |
host | <REDIS-NAME>.redis.cache.windows.net |
pendingEntriesCount | 2 |
port | 6379 |
stream | mystream |
ポイントは pendingEntriesCount
で、この値を超えるとスケールアウトが行われるというイメージですね。
試してみる
「Scale and replicas」の「Replicas」を確認すると、現在のレプリカ数が確認できます。こちらが増えるかどうか、確認していきます。
ちなみに、わたしの環境での初期値は 1 でした。
Redis に 2 件のデータを投入する
Redis のコンソール画面で下記のように入力し、2 件のデータを投入します。
XADD mystream * name Alice
XADD mystream * name Bob
XREADGROUP GROUP mygroup consumerx COUNT 2 STREAMS mystream >
冒頭の記事にあるように、XPENDING コマンド (XPENDING mystream mygroup
) を使用することで滞留している件数を確認することができます。
Conatiner Apps がスケールアウトされたか確かめる
Conatiner Apps 側でレプリカ数を確認します。
ここでは増えていない (1 のままの) 状態になると思いますが、これは想定された動作とのこと。
Redis にもう 2 件のデータを投入する
Redis のコンソール画面で下記のように入力し、追加で 2 件のデータを投入します。
XADD mystream * name Derek
XADD mystream * name Emily
XREADGROUP GROUP mygroup consumerx COUNT 2 STREAMS mystream >
Redis からデータを取り出していないため、ここでは 4 件のデータが滞留していることになっているはずです。
Conatiner Apps がスケールアウトされたか確かめる
「Scale and replicas」の「Replicas」を確認すると、新しいレプリカが作成されていることが分かります。
#「Ready」の数字が増えるのかと思いましたが、新しいレプリカが追加される感じですね。
Redis にもう 2 件のデータを投入する
冒頭の記事には無いですが、さらに追加で 2 件のデータを投入してみます。
XADD mystream * name Hoge
XADD mystream * name Fuga
XREADGROUP GROUP mygroup consumerx COUNT 2 STREAMS mystream >
無事、もうひとつのレプリカが追加されました。
Redis に追加してから 10 秒弱ほどで完了しており、なかなか早かったです。
Redis からデータを取り出す
XACK コマンドを下記のように実行し、滞留したデータを取り出しておきます。MESSAGE_ID
ごとに実行する必要があります。
XACK mystream mygroup <MESSAGE_ID>
Container Apps がスケールインされたか確かめる
しばらく待つと、レプリカ数が元通り 1 になっていることが確認できました。
なお、スケールインまで約 5 分ほどの時間を要しました。スケールアウト時と比べると緩やかですね。
確認してみたところ、KEDA の cooldownPeriod
が効いてきている箇所であることが確認できました。
既定では 300s (5min) ということで、その通りの動作となっていました。
ちなみに、このことを公式ドキュメントに書いてと要望をあげたのは、日本マイクロソフトの真壁さんでした😲
こういうコントリビューションの仕方もあるんですね。
まとめ
ということで、KEDA の仕組みを使用して Redis の状況に応じて Container Apps をスケールさせる方法でした。
思った以上に即座にスケールアウトしてくれたこともあり、なかなか使いどころもありそうな機能だなと思いました🤗
Discussion