Azure Cosmos DB Free Tier をプロダクション環境で使う

3 年くらい待ちました。ついに Azure Cosmos DB に Free Tier(無料利用枠)が登場です!
実は自分が待っていたのは無償利用枠というよりも比較的小規模なアプリ向けのプランでした(MS MVP として製品チームにも何度か直接フィードバックしてました)。それを Free Tier で実現してきた Cosmos DB チームには感謝しかありません。

Azure Cosmos DB Free Tier

詳細は 製品チームの公式ブログAzure Friday を見ましょう。あと、英語版公式ドキュメントの Understand your Azure Cosmos DB bill もおすすめです。ざっくりポイントは以下です(でも必ず公式ドキュメントは見ましょうね)。

  • サブスクリプションにつき 1 つの無料利用枠アカウントを作成できる
  • 無料枠の対象は 400RU/s かつ 5GB までのストレージまで
  • 無料枠内では有償枠と性能面での差はない(ここがすばらしい)
  • 超過するとその分だけ課金される
  • 共有スループットデータベースにも適用可能(25 コンテナまで)
  • autopilot との併用も可能(これはびっくり)

Free Tier を何に使うか?

よくある Free Tier ってお試し用途や開発用に使われることが多いと思います。もちろんそれも典型的なユースケースでしょう。でも、私が提案したいのは、この無料枠で小規模なアプリケーションのプロダクション用 NoSQL DB として使う方法です。

スループットが 400RU/s の枠内に入っていれば、機能面や性能面で有償版と全く変わらないので、一定のユースケースでは十分これが通用するはずです。というか通用してます。
自分が本番運用しているクリニック向けアプリ CLINET では、 400RU/s に設定した Cosmos DB で日々のクリニック予約処理を全く問題なく運用できています。約 3 年間で 1 一度も 429 は出たことがありません。しかも、アプリを利用しているクリニックは東京都目黒区
で多忙な内科トップクラスと言われる「学芸大学ファミリークリニック」様です。登録患者数は数万人を超えており、繁忙期にはその日の予約枠が 10 分程度で埋まってしまいます。それでも Cosmos DB は 400RU/s で運用できています。

CLINET のアーキテクチャ

アプリのマスタ系データストアとして使う

そのクリニック予約システムはマルチテナント構成になっているために、クリニック毎にさまざまな設定情報を持つ必要があります。各種名称はもちろん、診察種別や診察日、時間のパターンとか。それらはアプリを起動する際にほとんどの機能から呼び出されます。でも、トランザクションデータは Cosmos DB には持たないので極端に処理がバーストすることはありません。ちなみに予約トランザクションデータは、SQL Database を使っています。

このように設計次第では 400RU/s と 5GB 以内という制約の中でも十分運用できてしまうので。RU のモニターをみても繁忙時間帯でも 90RU/s ほどしか消費していないので、もっとテナントを増やす余力さえもあります。

CLINET のアーキテクチャ

データストアってその処理特性によって NoSQL だったり RDB だったりを使い分けるべきという話はいろいろな場でお話させてもらっているつもりですが、 Cosmos DB Free Tier が登場したことで、アプリのマスタ系データとの相性がさらに良くなった感じがします。

Free Tier をうまく使うための TIPS

  • サブスクリプションは、アプリ毎かつ開発用と本番用でそれぞれ分割する
  • プロビジョニングはデータベースレベル共有を選択する
  • グローバルレプリケーションやマルチマスターは使わない
  • ドキュメントはできるだけ小さく保つ
  • 不要なインデックスは設定しない
  • 大量の書き込みが必要なシーンでは Queue 経由で流量調整する
  • リトライ機構を持つ SDK からアクセスするように実装する
  • RU/s を正確にモニターすることは現状では難しいので、429 の発生を監視する

これ以外には autopilot との組み合わせが気になってますが、GA していないのでもう少し様子をみようと思っています(RU/m 消滅時のトラウマ)。

Hack Cosmos!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×