BPStudy #33 後半(Slim3)のメモまとめ

BPStudy #33に参加させていただきました。

前半は @kazunori_279 さんによる Google I/Oの貴重な最新レポートでした。
しかし私は前提知識が足りなかったため、ざっくりと理解するのがやっとでした。もったいないので、あとで復習したいと思います。
#appengine でComet! Channel APIでpushできるぞ - スティルハウスの書庫
BigQueryってなんぞ? - スティルハウスの書庫

Slim3のすごいトコ」

後半は、 @shin1ogawa さんによる Slim3の紹介でした。

このエントリでは後半のslim3の内容を自分なりにまとめます。(といっても有識者の方の記事の引用やリンクが大半になります。参考にさせていただいた皆様ありがとうございます)

プロパティ名を短くしてもコードの可読性を損ねない

app engineでは、プロパティ名が長いと、それだけ容量を喰うらしい。

特にログのように量の増えがちなデータに関しては、可能な限り短いプロパティ名にしておいたほうがよさそうです。
Google App Engineのプロパティ名は可能な限り短いほうがいいかもしれない - きしだのはてな

つまり何も考えずに「numberOfEmployeesThatExist」なんていうような長ったらしいプロパティ名をつけちゃうのはよくない。
で、slim3では、プロパティ名を@Attribute(name="hoge")によって別に設定しても、ソースコード上ではそれを意識せず実装できるので、可読性の高いコードが維持できる。

でも極端に短くして一文字とかだと、DatastoreViewer上ではプロパティ名での表示になるんだろうから、わけわかんなくなりそう。
ogawaさんは、短くするのは最後の手段だというようにおっしゃってました。

Global Transactionで簡単に整合性を保つ

Google App EngineにはTransactionは1つのEntity Group内でしかできないという制限があります。
(中略)
そうするとある口座から別の口座にお金を振込むような送金のパターンで、Transactionを利用することができません(すべての口座を1Entity Groupに押し込むと更新がぶつかって現実的ではないから)。送金パターンで整合性を保つためには、理論的には次のようになります。
(中略)
コードの量的にはそんなにたいしたことありませんが、質的な難易度はかなり高く、間違いなく実装するのはかなり大変です。
Google App EngineでGlobal Transaction - ひがやすを blog

ということで、EntityGroupを使わずとも、gtxを使えば容易に整合性を保った処理が実装できる。
注意点として、globalじゃない通常のtxとgtxが混在すると、整合性が保たれなくなってしまう。
質疑では、gtxは手軽なので、それに依存してプログラムの設計が甘くならないように注意、というような話も出ていました。

タイムアウトしても、Slim3が自動でリトライしてくれる

App Engineのアクセスは、少なくない確率でTimeoutExceptionが発生する。(それでも以前よりは減った?)
TimeoutExceptionが発生したら、リトライは手動で書くと面倒だけど、Slim3は自動でリトライしてくれる。

スキーマの変更をスキーマバージョンで管理する

KVSではスキーマに変更があると、異なるスキーマが混在することになる。そのため、エンティティにスキーマのバージョンを管理するフィールドを持たせるテクニックがある。Slim3では、それをFWで提供している。
ModelをBUILDすると@Model(schemaVersion = 1)となっている。これがスキーマバージョン。
(注:@Attribute(version = true) はスキーマバージョンではなく、楽観的排他制御バージョン)
下記のページにschemaVersionについて詳しく説明されていました。参考にさせていただきます
appengine ja night 5 BT SchemaVersionの薦め
Fragile Code: schemaVersionプロパティ
404 shin1のつぶやき ないわー Not Found: #appengine でスキーマ変更に対応するバッチ処理を行う

楽観的排他制御をバージョン管理

これはスキーマバージョンとは別の話。
こちらは@Attribute(version=true)で管理。
ひがさんの関連記事をリンクさせていただきます
App Engineでバージョンによる楽観的排他制御 - ひがやすを blog
トランザクション (Slim3 日本語サイト(非公式))

ユニークインデックス

あるプロパティ値のユニークさを保障する目的で使用するそうです。

  • Datastore#putUniqueValue()
  • Datastore#deleteUniqueValue()

タイプセーフだし、コンパイル時にエラーを検出してくれる

Slim3では、APT(Annotation Process Tool)によって、Metaクラスの生成によるタイプセーフなクエリや、Slim3特有のコンパイルエラー検出を実現している。
ogawaさんの「コンパイル時にエラーがわからなければJavaを使う意味がない」というような言葉が印象的でした。

プロダクション環境でテストができるKotori

AppEngineでは、開発環境とデプロイ環境で動作が異なる場合がある。そこでKotoriはプロダクション環境でのテストを実現してくれる。@bufferings さんが作成し、海外でも好評だそうです。UIはGWTで実装されている。
注意点としては、CPUをすごく消費するので、上限には気をつける。

Slim3はテストのヘルパーが充実している

App EngineのFWはほかにもあるけど、Slim3を選ぶ大きな理由のひとつだという話です。AppEngineTesterやControllTesterがなかったらテスト書くのは超大変なんでしょうねきっと。