🎼

Azure Container Apps (KEDA) で Redis の状況に合わせてスケールさせる

2023/02/14に公開

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