ビープラウド社長のブログ

株式会社ビープラウドの社長が、日々の思いなどを綴っていきます。

appengine ja night#4に参加してきた その2

1月22日にappengine ja night#4に参加(主催者のスティルハウス佐藤一憲さんのまとめはこちら)。

後半は、荒川さん(@ashigeru)さんの「Transaction puzzlers」(前半の発表は、前のエントリーにて)

Google App Engineでいちばん難易度の高いところは、DataStoreの使い方とトランザクションに対する考え方である。

@ashigeruさんの発表内容は以下の通り。それぞれの概要を復習代わりにまとめておく。

トランザクション処理の考え方
トランザクションはリソースを一時的に独占できる技術で、同時に変更して不整合が起こるなどを回避するためのもの

楽観的ロック/悲観的ロック(GAEは楽観的並行性制御)

■Entity Groupの基礎説明
・GAEのトランザクションはEntity Group単位
・同一Entity Group内のエンティティに対する操作はACID
・Entity Groupは、同じルートキーを持つエンティティ群
 →データストア上で近くに配置される
トランザクションの範囲はエンティティ新規作成時に決まり、後から変更できない
・Entity Groupの設計が非常に重要
 間違えると並列性が極端に低下する。うまくいやればスケールアウトする

トランザクションのパターン
○Read-modify-write
トランザクションの範囲は読込-書込-保存の間。SQLでいうSELECT FOR UPDATE

トランザクションの合成
同じEntity Group内の複数のトランザクションを合成する
(例)非正規化した2つの情報を同時に更新など
同じトランザクションが2つあったら1度に処理する。

○ユニーク制約
キーでエンティティを取り出して存在しない場合新規に登録する(get〜putまでが1トランザクション内)

○冪等な処理(idempotent)
複数回成功しても、1回分しか結果が反映されないような処理
1度成功しているか確認し、成功していない場合、処理を実行し、成功していたら何もしない(1トランザクション内)。

○Exactly Once
いつかは、確実に1回成功する処理
無限ループで実現するのはGAEの30秒ルールにかかるので、Task Queueを使用する

○BASE Transaction
複数のEntity Groupにまたがる緩いトランザクション
上記のパターンを組み合わせて、実装する。
(Read-modify-write、Exactly Once、トランザクションの合成、冪等な処理)
例:口座間の送金処理

注意点
・Eventual Consistency:いずれ整合性がとれる

@ashigeruさんが発表したような実装パターンを集めていくことによって、前半に浅海智晴さんの発表したような自動生成が可能になるのではないかとおもう。トランザクションの実装パターンを、シンプルなパターンから丁寧に説明し、聞いている人の理解を確実に深めていく発表でとてもわかりやすかった。内容だけでなく、資料のつくりかた、プレゼンテーションなど参考になることいっぱいの発表だった。

今年の目標102エントリーまであと95