趣味での
Cosmos DBとの付き合い方
koudenpa
2020-08-09
目次
• 自己紹介
• 使い始めた時の話
• Hack Azureを聴いての話
• オチ
自己紹介
• id: koudenpa
• 大体これ
• Twitter: @koudenpa
• Blog: https://koudenpa.hatenablog.com/
• GitHubは https://github.com/7474
• SI業界 -> Web業界
• 今は https://hatenacorp.jp/recruit/engineer/
• Azure、.NET(C#)は趣味と実益
• Cosmos DBは現状趣味
趣味と実益
• 趣味
• 興味のある要素技術を使ってみて楽しむ
• 実益
• 慣れていない要素技術の実感を掴む
• 色々応用が利く
• 現状趣味でも実益も兼ねる
話すこと
• Cosmos DBとの付き合いで
• こんなことした
• こんなことで困った
• こんなこと思った
• 1エンジニアの感想として聴いてもらえれば幸い
使い始めた時の話
Document DBへの興味
• NoSQLが広まってきて
• 名前がDocument DBだったころから
• 興味だけはあった
でも高い
• 最小単位が400RU
• だいたい2500円/月
• 趣味でカジュアルに立てっぱなししたい額ではない
• Table Storage数円、とかで暮らしてるのだから
Azure界隈のコスト感
• なんだかエンタープライズ
• 僕は趣味
• 帯に短したすきに長し……
• たすきでも長い
• 指輪位の長さでいい
• 50RUとか欲しかった
1カ月無料の使い時
• https://azure.microsoft.com/ja-jp/try/cosmosdb/
• >データベースを作成すると、30 日間無料でアクセスできます。
• Azureアカウント毎に1回だけ
• だらだら「立てっぱなしにしたい」には不向き
• 試したいなら立ててすぐ潰せばいい
• 数円位払う
• それでもいい加減試そうと試した
APIの選択
• 色んなAPIがある
• 後から変えられない
• まぁSQLかな
• 何故なら.NETのSDK + LINQで書きたいから
• 大好きLINQ
• 実際のところSQLが良いらしい
• 互換APIは元々互換DB向けのアプリケーションの場合とか
LINQ書けるのは便利
• 感覚がEntityFrameworkな気はする
そしてFree Tierへ
• 使い始めたら無料提供が始まった
• ラッキー
Freeからはみ出る
• 何故かアプリのコードでDBを作るようにしていた
• 多分サンプルコードコピったままだったんだと思う
• 環境を変えて実行したら沢山DBが生えた
• Free Tierは1つのDB
• DB内にコンテナは複数作ることができる
• なので余裕ではみ出た
• 気づいて慌てて消した
CreateDatabaseIfNotExistsAsync
• DBがなければ作る便利メソッド
• Database IDに変数を与えると当然増える
その時の請求書
•  3 2 - 慌てて消して助かった
教訓を得たもの
• コード
• https://github.com/7474/MultiComputerVision/blob/master/MultiC
omputerVisionService/Service/CosmosResultRepositoryService.cs
• 記事
• https://koudenpa.hatenablog.com/entry/2020/03/01/193541
• 動いている様子
• https://blazormulticomputervisionwebasmserver.azurewebsites.net/
気になり
• パーティションキー
• どう設定、分割すればいいのか
• サッパリ感覚がつかめていなかった
• 別にCosmos DBに限らないが制約との付き合い方は難しい
• 便利さ
• データの塊を1つのドキュメントして保存できるのは便利
• 位の感覚だった
Hack Azureを聴いての話
Hack Azure
• なんかMVPの人がやってるイベント(という認識)
• 7月はCosmos DB会だった
• https://msdevjp.connpass.com/event/182455/
• Cosmos DBのさわりが知れるいい会だった
気になり
• いくらか腑に落ちた点を紹介
パーティションとの付き合い方?
• 用途次第なので答えはない
• 大規模データではパーティションをまたいだクエリは避ける
• Cosmos DBを使う上での原則
• ID指定の書き込みだけと割り切るのは一つの答え
• ID自体をパーティションキーにすればよい
• https://docs.microsoft.com/ja-jp/azure/cosmos-db/partitioning-
overview#using-item-id-as-the-partition-key
• 論理パーティション
• 物理パーティションはさほど別れない
書き込みと読み込みを分ける?
• 用途別にデータストアを分ける世界観を感じた
• Change Feed
• セミリアルタイムにデータ同期を行えるの便利
• Functionsのトリガーにしてみて実際さっと使えて良かった
• 得意な用途の他のデータストアを検討
• Cosmos DBはクエリ苦手
• 大規模データはパーティションの壁がある
オチ
趣味プログラムでの冴えたやり方
• 大したアクセスがないなら
• パーティション気にしなくて
• いいんじゃない?
100GBも使わないし……
• https://docs.microsoft.com/ja-jp/azure/cosmos-
db/partitioning-overview#partition-keys-for-read-heavy-
containers
• クロスパーティションクエリを気にした方がいい規模
• 物理パーティションが分かれる目安
• > Your container will have over 30,000 RU's provisioned
• > Your container will store over 100 GB of data
• Free Tierは400RU、5GB!
実益を兼ねるなら色々気にしたい
• のでイベントは色々知れて便利
• ありがたい
• Cosmos DBとの付き合いははじまったばかり
• RDB脳だとうまく使えないという実感を得られた気がしている
• 自分の場合理屈はともかく実感はなかなか得られない
• 上手く使えるネタを思いついたら付き合いを変えようと思っている
まとめ
• 趣味のプログラミングなら
• Free Tierを気の向くままに使えばいい
• 実益を兼ねるなら
• ドキュメントやイベントでいい使い方を知って試す
• Cosmos DBはユースケースで大分使い方が変わると思う

趣味でのCosmos DBとの付き合い方

Editor's Notes

  • #9 RU = Request Unit