Google App Engine と Cloud Datastore だけでオークションサイトを作った
こんばんは!サーバレスしてますか!
Google App Engine (GAE)がなんか最近イケてるとかイケてないとかいう話を聞いて、とりあえず何か小さなサービスを作って試してみようと思ったのですが、どうせ作るなら毒にも薬にもならない掲示板とかじゃなくて罠を踏み倒しそうな感じのが良いと思い、オークションサイトを作ってみました。
データべースはRDBを一切使用せず、Cloud Datastoreのみで構築しています。え、Cloud DatastoreってKey-Valueストアじゃないの?と思うかもしれませんが、実は色々なクエリが使えたりトランザクションが使えたりするので、仮想通貨の受け渡しなんかもわりと真っ当に実装することができます。
ただし、RDBのように扱えるかというとやはりそうではなく、様々な制約があるので、Cloud Datastoreに特化したテーブル設計が必要となります。特にData Consistencyのドキュメントは10回くらい読んだほうが良いです。
Data Consistency | Google Cloud Platform
制約はいろいろありますが3行でまとめると、
- トランザクション内で使えるのはAncestorを指定したクエリだけ
- 1つのトランザクション内でアクセスできるエンティティグループは25個まで
- 1つのエンティティグループに対する更新は1秒1トランザクションまで
という感じです。なのでテーブル設計の段階から、トランザクションが必要なデータはルートエンティティにしないようにしたり、1つのエンティティグループへの更新が集中しないような親子関係にするといった工夫が必要になります。1秒1トランザクションという制約はかなり厄介で、今回作ったオークションサイトでも入札の整合性をどうやって保つかで苦労しました。
とは言え勝手にスケールアウトしてくれるというのはとても魅力的で、今回作ったオークションサイトも、アクセスが無ければ維持費$0、何かの間違いでYahoo砲を食らっても無限にスケールする(※ただし予算がスケールするとは言っていない)というのは非常に楽です。
まあそんなこんなで、本当にちゃんとスケールするのか試してみたいのでみんなツイッターで拡散してね!