Google App Engine:
Datastore を理解しよう
@bufferings
2010/03/26
#appengine ja night in kansai 1 ( #ajnk1 )
自己紹介
@bufferings
●
Slim3 サイトの日本語化
http://sites.google.com/site/slim3documentja/
Kotori Web JUnit Runner
#appengine ja night in kansai 1 ( #ajnk1 ) 3
#appengine ja night
#appengine ja night
in kansai
#appengine ja night in kansai 1 ( #ajnk1 ) 5
京都 GTUG とは ?
正式名称
「Kyoto Google Technology User Group」
Kyoto GTUG
目的
純粋・シンプルにGoogleのテクノロジーを
理解・習得するための活動をする。
(これは、世界中のGTUG共通の目的)
*漢字表記の「京都GTUG」は国内のみの利用でお願いします。
Google Technology User Group
●
現在、全世界で 27 ヶ国 60 を超える地域でローカ
ルな GTUG が設立されています。
http://www.gtugs.org/directory
●
各地域で、 Google のテクノロジーに興味のある
方々が組織を立ち上げています。
●
将来的には、地域を越えたイベントもやりたいよ
ね!という話が、マネージャの ML でやりとりされて
#appengine ja night in kansai 1 ( #ajnk1 ) 7
京都 GTUG へ!
●
まだ、参加してない方はぜひ参加して下さいね!
●
京都 GTUG
http://kyoto-gtug.org/
●
京都 GTUG (Google Group)
http://group.kyoto-gtug.org/
後援:京都リサーチパーク株式会社
●
京都リサーチパーク株式会社
http://www.krp.co.jp/
●
この会場は、京都リサーチパーク株式会社の後援
によりご提供していただいております。
#appengine ja night in kansai 1 ( #ajnk1 ) 9
Agenda
Introduction
Entity & Entities Table
Entity Group & Transaction
Query & Index Tables
Introduction
●
Google App Engine
●
Datastore
●
Datastore API
●
Bigtable
●
Datastore 脳
#appengine ja night in kansai 1 ( #ajnk1 ) 11
Google App Engine
Google App Engine
#appengine ja night in kansai 1 ( #ajnk1 ) 13
Introduction
●
Google App Engine
●
Datastore
●
Datastore API
●
Bigtable
●
Datastore 脳
Datastore
#appengine ja night in kansai 1 ( #ajnk1 ) 15
Introduction
●
Google App Engine
●
Datastore
●
Datastore API
●
Bigtable
●
Datastore 脳
Datastore API
#appengine ja night in kansai 1 ( #ajnk1 ) 17
Datastore API
Introduction
●
Google App Engine
●
Datastore
●
Datastore API
●
Bigtable
●
Datastore 脳
#appengine ja night in kansai 1 ( #ajnk1 ) 19
Bigtable
Introduction
●
Google App Engine
●
Datastore
●
Datastore API
●
Bigtable
●
Datastore 脳
#appengine ja night in kansai 1 ( #ajnk1 ) 21
Datastore 脳
Datastore 脳を手に入れるために
まずは
Datastore を理解しよう
#appengine ja night in kansai 1 ( #ajnk1 ) 23
Entity & Entities Table
Datastore はどのように
データを格納するのかな?
Entity & Entities Table
●
Entity
●
Kind
●
Bigtable
●
Entities Table
●
データ型
●
押さえておきたいコト
#appengine ja night in kansai 1 ( #ajnk1 ) 25
Entity
Entity
#appengine ja night in kansai 1 ( #ajnk1 ) 27
Entity
Entity
#appengine ja night in kansai 1 ( #ajnk1 ) 29
Entity
Entity
#appengine ja night in kansai 1 ( #ajnk1 ) 31
Entity
Entity > 例
#appengine ja night in kansai 1 ( #ajnk1 ) 33
Entity & Entities Table
●
Entity
●
Kind
●
Bigtable
●
Entities Table
●
データ型
●
押さえておきたいコト
Kind
#appengine ja night in kansai 1 ( #ajnk1 ) 35
Entity & Entities Table
●
Entity
●
Kind
●
Bigtable
●
Entities Table
●
データ型
●
押さえておきたいコト
Bigtable
Row name Row data
A distributed, shared, sorted Array
#appengine ja night in kansai 1 ( #ajnk1 ) 37
Entity & Entities Table
●
Entity
●
Kind
●
Bigtable
●
Entities Table
●
データ型
●
押さえておきたいコト
Entities Table
#appengine ja night in kansai 1 ( #ajnk1 ) 39
Entities Table
Entities Table
Path
#appengine ja night in kansai 1 ( #ajnk1 ) 41
Entities Table
Entities Table
Protocol Buffers
●
Bigtable や Google Wave で実運用されている
オープンソースのシリアライザー
http://code.google.com/p/protobuf/
#appengine ja night in kansai 1 ( #ajnk1 ) 43
Entities Table
Entities Table > 例
#appengine ja night in kansai 1 ( #ajnk1 ) 45
Entity & Entities Table
●
Entity
●
Kind
●
Bigtable
●
Entities Table
●
データ型
●
押さえておきたいコト
データ型 1
型 ソート順 備考
java.lang.String Unicode バイト順 ブール値
整数 数値
浮動小数点数 数値
java.util.Date 時系列
列挙 java.lang.Enum Unicode
com.google.appengine.api.users.User
長いテキスト文字列 com.google.appengine.api.datastore.Text (順序付け不可) インデックス化されません。 長いバイト文字列 com.google.appengine.api.datastore.Blob (順序付け不可) インデックス化されません。
Java クラス 短いテキスト文字列(500文
字以下)
500文字よりも長い場合は IllegalArgumentException 短いテキスト文字列(500文
字以下)
com.google.appengine.api.datastore.Short Blob
500バイトよりも長い場合は IllegalArgumentException boolean or java.lang.Boolean false < true
short, java.lang.Short, int, java.lang.Intege r,long, java.lang.Long
長整数として格納された後、フィールド型 に変換されます。範囲外の値はオーバー フローします。
float, java.lang.Float, double, java.lang.Dou ble
倍精度浮動小数点数として格納された後
、フィールド型に変換されます。範囲外の 値はオーバーフローします。
日付/時刻
Enum#name()の文字列が格納されます。 Google アカウント
メール アドレス
(Unicode)
com.google.appengine.api.datastore.Key, パス要素単位(種
#appengine ja night in kansai 1 ( #ajnk1 ) 47
データ型 2
型 ソート順 備考
カテゴリー Unicode
メールアドレス com.google.appengine.api.datastore.Email Unicode
緯度の後に経度 Unicode
URL com.google.appengine.api.datastore.Link Unicode
電話番号 Unicode
郵便番号 Unicode
数値 Java クラス
com.google.appengine.api.datastore.Categ
ory
浮動小数点の緯度と経度
の座標で表される地点
com.google.appengine.api.datastore.GeoP
t
インスタント メッセージング ハンドル
com.google.appengine.api.datastore.IMHan
dle
com.google.appengine.api.datastore.Phon
eNumber
com.google.appengine.api.datastore.Postal
Address
コンテンツについてユーザ ーが入力する評価(0 ~ 100 の整数)
com.google.appengine.api.datastore.Ratin
g
データ型 3
●
複数値
●
1つのプロパティ名に対して、コア型からなる複
数の値を持つことができる
#appengine ja night in kansai 1 ( #ajnk1 ) 49
データ型 4
●
シリアライズ可能クラスは BLOB 値として保存
●
複数値の要素として BLOB で保持することもできる
Entity & Entities Table
●
Entity
●
Kind
●
Bigtable
●
Entities Table
●
データ型
●
押さえておきたいコト
#appengine ja night in kansai 1 ( #ajnk1 ) 51
ソフトスキーマ
Null 値と Unset
#appengine ja night in kansai 1 ( #ajnk1 ) 53
Kind とスキーマ
Entity Group & Transaction
Transaction
はどんな感じ?
#appengine ja night in kansai 1 ( #ajnk1 ) 55
●
Bigtable & Datastore
●
Entity Group
●
Transaction
●
押さえておきたいコト
●
Global Transaction
Entity Group & Transaction
Bigtable & Datastore
●
Bigtable
●
行単位の ACID をサポート
●
Datastore
●
Entity Group 単位の ACID をサポート
#appengine ja night in kansai 1 ( #ajnk1 ) 57
●
Bigtable & Datastore
●
Entity Group
●
Transaction
●
押さえておきたいコト
●
Global Transaction
Entity Group & Transaction
Entity Group
#appengine ja night in kansai 1 ( #ajnk1 ) 59
Entity Group
Entity Group
#appengine ja night in kansai 1 ( #ajnk1 ) 61
Entity Group
Entity Group
#appengine ja night in kansai 1 ( #ajnk1 ) 63
Entity Group
Entity Group
#appengine ja night in kansai 1 ( #ajnk1 ) 65
Entity Group
Entity Group
#appengine ja night in kansai 1 ( #ajnk1 ) 67
Entity Group
●
Bigtable & Datastore
●
Entity Group
●
Transaction
●
押さえておきたいコト
●
Global Transaction
Entity Group & Transaction
#appengine ja night in kansai 1 ( #ajnk1 ) 69
Transaction > 例 : カウンター
Transaction > 例 : カウンター
#appengine ja night in kansai 1 ( #ajnk1 ) 71
Transaction > 例 : カウンター
Transaction > 例 : カウンター
#appengine ja night in kansai 1 ( #ajnk1 ) 73
Transaction > 例 : カウンター
Transaction > 範囲
#appengine ja night in kansai 1 ( #ajnk1 ) 75
Transaction > 範囲
Transaction > 仕組み
#appengine ja night in kansai 1 ( #ajnk1 ) 77
Transaction > 仕組み
●
Timestamp を使用した楽観的並行性制御
Transaction > 例 : ユニーク制約
#appengine ja night in kansai 1 ( #ajnk1 ) 79
Transaction > 使用可能なクエリ
Transaction > 使用可能なクエリ
#appengine ja night in kansai 1 ( #ajnk1 ) 81
Transaction > Read
●
Tx 外では READ_COMMITED 相当
Transaction > Read
●
Tx 内では SERIALIZABLE 相当
#appengine ja night in kansai 1 ( #ajnk1 ) 83
Transaction > Read
●
Tx 内では自分の行った変更も見られない
●
Bigtable & Datastore
●
Entity Group
●
Transaction
●
押さえておきたいコト
●
Global Transaction
Entity Group & Transaction
#appengine ja night in kansai 1 ( #ajnk1 ) 85
ポイント
●
所属 EG は Entity 作成時に決まり、変更できない
●
EG を大きくすると Tx で独占する Entity が多くなる
●
衝突の可能性が高くなる
●
EG はできるだけ小さくする
●
Tx を必要としない場合は EG ではなく Key による
関連にする
●
Bigtable & Datastore
●
Entity Group
●
Transaction
●
押さえておきたいコト
●
Global Transaction
Entity Group & Transaction
#appengine ja night in kansai 1 ( #ajnk1 ) 87
Global Transaction
Slim3 には
Global Transaction があります
(!?)
参考資料
●
Developer’s Guide - Google App Engine
注:日本語の情報は古いので読むなら英語
http://code.google.com/intl/en/appengine/docs/
●
Mastering the datastore - Google App Engine
http://code.google.com/intl/en/appengine/articles/datastore/overview.html
●
Slim3
Slim3 を使うなら公式ドキュメントの JDO 読まずに Slim3 の Datastore を読めば良い
http://sites.google.com/site/slim3appengine/
Slim3: 日本語訳
#appengine ja night in kansai 1 ( #ajnk1 ) 89
参考資料
●
Under the Covers of the Google App Engine Datastore
http://sites.google.com/site/io/under-the-covers-of-the-google-app-engine-datastore
スライドは
http://snarfed.org/space/datastore_talk.html
●
[PDF] Google I/O 2009 - From Spark Plug to Drive Train:Life of an App Engine Request
http://dl.google.com/io/2009/pres/W_1115_From_Spark_Plug_To_Drive_Train_Life_of_an_App_Engine_Request.pdf
●
Google App Engine - Devfest India 2010
http://www.slideshare.net/chanezon/google-app-engine-devfest-india-2010
●
Bigtable: A Distributed Storage System for Structured Data
http://labs.google.com/papers/bigtable.html
参考資料
●
京都 GTUG 勉強会資料
http://sites.google.com/a/kyoto-gtug.org/home/docs
[PDF] Google App Engine Hackathon in Kyoto 事前勉強会 その1用資料
http://blog.daisukeyamashita.com/blog-files/Google%20App%20Engine%20Hackathon%202009-07-17.pdf
[PDF] Google App Engine Hackathon in Kyoto 事前勉強会 その 2 用資料
http://blog.daisukeyamashita.com/blog-files/Google%20App%20Engine%20Hackathon%202009-07-24.pdf
●
Google App Engine for Java を使ってみよう!: CodeZine (コードジン)
http://codezine.jp/article/corner/289
●
分散 Key-Value ストアの本命「 Bigtable 」 - @IT
#appengine ja night in kansai 1 ( #ajnk1 ) 91
参考資料
●
@kazunori_279 さんの書庫
http://d.hatena.ne.jp/kazunori_279
参考になる記事が沢山。特にこれを何度も見た。
http://d.hatena.ne.jp/kazunori_279/20090617/1245224939
●
@shin1ogawa さんのスライド集
http://www.slideshare.net/shin1ogawa/presentations
●
@ashigeru さんの宝箱
http://gist.github.com/294650
●
@ashigeru さんの Transaction Puzzlers
http://www.slideshare.net/ashigeru/ajn4
●
Life is beautiful: Google App Engine 上のベスト・プラクティス、その1 : Datastore
http://satoshi.blogs.com/life/2010/02/app_engine.html
●
参考資料
●
Google を支える技術 ~ 巨大システムの内側の世界
http://www.amazon.co.jp/o/ASIN/4774134325
●
Google App Engine for Java [ 実践 ] クラウドシステム構築
http://www.amazon.co.jp/o/ASIN/4774139858
●
Programming Google App Engine
http://www.amazon.co.jp/o/ASIN/059652272X
●
雲の世界の向こうをつかむ クラウドの技術
http://www.amazon.co.jp/o/ASIN/4048680641
#appengine ja night in kansai 1 ( #ajnk1 ) 93