GCPUG Shonan feat.GAE Vol.1 その3

GCPUG ShonanでGAEシリーズの1回目が開催されました。その3 Datastoreを書きました。

2016/3/5

個人的な話になりますが、GCPUG Shonanの管理者をやらせて頂いています。
今回は、Google App Engine シリーズの1回目ということで、茅ヶ崎で開催しました。

3つのセッションの内、3つ目を書いてみたいと思います。

3本目のセッションは、Datastoreについてでした。

Google App Engineを本格的に使うには、Datastoreは、欠かせません。

そして、最初に躓くところでもありますよね。特に、RDBが得意な方ほどハマりどころが多いと言う困ったものです。ただ、GAEのオートスケールの凄さを支えているものでもあります。

登壇者

@sinmetalさん です。

CP300という、GoogleがGCPを広めるために作った資格があるのですが、そちらの日本で唯一の講師をされています。

既に、GCP全体の人になってしまっていますが、そもそもはGAEのスペシャリストです。色々なところで、GAE愛を感じています。

もともとは、Javaをガッツリ使っていたそうですが、最近はGolangの割合が増えてきているようです。

そんな、GAEを知り尽くしている@sinmetal さんには、GAEの最初の鬼門ともいうべきDatastoreについてお話をして頂きました。

スライド

スライドは、こちらです。

かなり盛りだくさんです。

Datastoreだけでも1冊の本が出来るくらいの内容になっています。また、CP300では、Datastore全体で3時間程度はかかるそうです。

その内容を1時間という短い時間に詰め込んだスペシャル版ですね。

内容について

かなり濃い内容で、要約することは難しいので、僕が印象に残ったところをかい摘んで、僕の知識での補足もしながらご紹介します。

Datastoreの作り

Datastoreは、Googleが内部でガッツリ使用しているNoSQLデータベースの Big Table が動いています。

Megastore というTransaction機能が乗り、一番上の層で Query を実行する仕組みが動いているそうです。

GAEが出た当初は、_XG_Transaction_ は、使えなかったのですが、_Megastore_ が入ったことで制限はあるものの使えるようになったそうです。

最近 Cloud BigTable というサービスも始まっていますが、アプリケーションで実用化するには、この辺りを自分で実装する必要があるんですかね?

Keyについて

Datastoreを使うには、Keyの作りを理解する必要があります。

Datastoreを効率良く使うには、 Entity Group を上手く使うことが必要になりますが、それらはKeyの作り方で決まります。

この辺りが、Datastoreを理解しづらくする大きな要因でしょう。

セッションでは、keyの構造、内部的にどうsortされるかなどを紹介して頂きました。

Eventual Consistency と Strong Consistency について

日本語でいうと、「ゆるい一貫性」と「強い一貫性」でしょうか。

Datastoreでは、更新したデータが即時で反映されないことがあります。

その中でも、Strong Consistency となっているものは、一貫性をもってオペレーションが出来ることになります。
それぞれ、以下のような整理になります。

・Strong Consistency
   Key Operation
   Ancester Query

・Eventual Consistency
   Query

それぞれのオペレーションについて紹介して頂きました。

Key Operation

Keyによる、Get, Put, Deleteです。

Golang では以下の様になります。(出典:スライドより)

func handle(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    k := datastore.NewKey(ctx, "Entity", "stringID", 0, nil)
    e := new(Entity)
    if err := datastore.Get(ctx, k, e); err != nil {
        http.Error(w, err.Error(), 500)
        return
    }
}

Query

filterなどを利用した、いわゆるQueryです。

Queryは、Eventual Consistencyです。 データを更新した後、Getでは取得できるが、Queryでは取得出来ないというケースが起こりえます。

Queryは、ちょっと苦手ですね。この後に紹介されている、Indexを使いながらの検索となります。

上手く使わないと、課金が増えたり、遅くなったりと色々発生しますね。

Ancester Query

Ancester Queryは、先祖(親)キーを指定したQueryです。

DatastoreのKeyを作る際に、親キーを指定します。その親キーも親を指定することが出来ます。同じ先祖(親)を持つEntityが Entity Group となります。

通常のQueryとの大きな違いは、 Strong Consistency になるということです。

ここはとても重要でDatastoreを使うときには、 Ancester Key は必ず意識するべきものとなります。

以下はちょっと補足です。(ここは、僕の理解なので間違っていたらご指摘下さい)

[そもそも、なぜConsistencyを意識する必要があるのか?]
Datastoreは、High Replication Datastore(HRD)が採用されています。高可用性を実現するために、複数のデータセンターにリプリケーションすることで、メンテナンスによるダウンタイムなどをなくしています。
このリプリケーションをしている間の不整合な状態を意識する必要が出ています。

HDRにより基本的には、Eventual Consistency となるQueryの中で、Ancester Query に関してはStrong Consistencyを実現していますよ。

ということかなと思います。

Index

これも、Datastoreで特に意識するべきことです。

Datastoreは、BigTableを機能拡張して作られているということは、先に記載しましたが、BigTableは、Keyのみの取得しか出来ません。

このため、QueryなどをDatastoreで行うために、これが出来るようにBigTableに並びを変えたTableを作成しています。それがIndexです。

Indexの数を増やせば、その分のデータがそのまま入るので実際に入れた2倍、3倍.... と増えてしまうことになります。

Indexには、以下の2種類があります。
それぞれについて説明をして頂きました。

  • Single Property Index
  • Custom Index

Single Property Index

Entityを作成すると、その定義によって作成されます。

Entityは、アプリケーションでは、Modelとし定義することが多いと思いますが、その際に_noindex_を指定しないとdefaultでIndexが作られます。

このIndexは、単項目でのQuery、Sortで使われます。

Query、Sortで使うことのない項目は、必ず_noindex_ を設定しましょう。

Custom Index

Single Property Index で対応出来ないQuery等を行う場合に使用されます。

GAEの設定ファイルの一つである、index.yaml or index.xmlを作ります。

ローカル環境で該当のQueryを実行すると、自動でindex.yamlを作成してくれます。そのままdeployをすると反映されます。

Index爆発

DatastoreのKindには、List Propertyを指定することが可能です。

このList Propertyに対してもQueryが出来るのですが、そのためには、indexが必要になります。

特に、複数のList Propertyに対してのQueryをやろうとすると、、*爆発*します。

それぞれの掛け算分のIndexができて、それぞれのindexにデータが入っていることになるので、もうどうなるか分かりません。。

気をつけましょう。

その他

ここのブログで紹介できなかった部分も紹介して頂きました。

  • Missing Property
  • Vacuum Index
  • Queryの制約
  • Transaction

など

あまりに内容が濃かったのでブログでは紹介しきれませんでした。ゴメンナサイ。

最後に

@sinmetalさん、お忙しい中ありがとうございました。

濃い内容になるとは思ったのですが、思っていた以上でした。

次回登壇をお願いする時は、もっと長い時間を取るようにしますので、今後ともよろしくお願いします!

本当の最後に。

今回は、茅ヶ崎南口から3分のところにある、茅ヶ崎loginさんでの開催でした。

とてもリーズナブルで、臨機応変に対応頂き、懇親会の料理には、大豆屋さんのお豆腐も特別に使って頂きました。

湘南地域を中心に開催を考えているので毎回とは行きませんが、今後も利用させて頂きたいと思います。

以上で、今回のイベントの紹介は終了です。

最後まで読んで頂いてありがとうございました!!

By nuki_pon

Related articles

--- AD ---