appengine ja night #6 図解global transaction
DESCRIPTION
#ajn6 で喋る予定の内容TRANSCRIPT
図解
Global Transaction
appengine ja night #6
あらかわ (@ashigeru)
appengine ja night #6 - @ashigeru 22010/03/19
講演者について
名前
あらかわ (@ashigeru)
所属
株式会社グルージェント 開発部
普段の業務
教育 (Computer Aided Education)
研究開発 (コンパイラ系)
ブログ書き (Song of Cloud Blog)
appengine ja night #6 - @ashigeru 32010/03/19
祝 Slim3 1.0.0 Released
“The main features of Slim3 are as
follows:
Global Transactions
Faster than JDO/JPA
Fast spin-up
HOT reloading
Type safe query”
appengine ja night #6 - @ashigeru 42010/03/19
今日の内容
トランザクションの基礎
グローバルトランザクションの仕組み
グローバルトランザクションの制限
今回のルール最適化に関するネタバレなし
30分ルールでしゃべる
DSL禁止
appengine ja night #6 - @ashigeru 52010/03/19
トランザクションの基礎
まずはおさらい
5
appengine ja night #6 - @ashigeru 62010/03/19
トランザクション処理の考え方
リソースを一時的に独占できる技術
同時に変更して不整合が起こる、などを回避
すべて成功するか、すべて失敗するか
中途半端に終わらない
アトミック性 (ACIDのA)
appengine ja night #6 - @ashigeru 72010/03/19
App Engineのトランザクション
Entity Group (EG) ごとのローカルトランザクション
ACID特性を持つ
楽観的並行性制御
難点
2つ以上のEGをまたいだ操作ができない
エンティティは作成後EGを変更できない
EGに含まれるエンティティを全て独占
appengine ja night #6 - @ashigeru 82010/03/19
モデリングの例 (1)
チケットをポイントで買うシステム
ユーザごとにポイントの口座がある
ポイントを消費してチケットを買える
ポイントが足りないとチケットを買えない
チケットは数に限りがある
appengine ja night #6 - @ashigeru 92010/03/19
モデリングの例 (2)
全ての人が全てのチケットを買える
同時に操作する可能性があれば同一EGへ
appengine ja night #6 - @ashigeru 102010/03/19
ローカルトランザクションの問題
EG設計が難しい
同時に操作するものを同じEGに
EG内のエンティティを全て独占
appengine ja night #6 - @ashigeru 112010/03/19
グローバルトランザクションの仕組み
トランザクションプロトコルの設計を段階的に
11
appengine ja night #6 - @ashigeru 122010/03/19
グローバルトランザクション
複数のEGにまたがるトランザクション
参加するEGを選択して独占
appengine ja night #6 - @ashigeru 132010/03/19
説明の進め方
うまくいかない実装方法を中心に紹介
ちゃんと動いている例は後半戦で
今回利用する題材
Aliceがチケット「ajn6」を購入
チケット「ajn6」は500ポイント消費
Aliceの残りポイントが500を切ると買えない
チケット「ajn6」は数に限りがある
※appengine ja night #6 は参加無料です
appengine ja night #6 - @ashigeru 142010/03/19
順次ローカルトランザクション
まずはダメな例から
14
appengine ja night #6 - @ashigeru 152010/03/19
順次ローカルトランザクション (1)
ローカルトランザクションを順番に実行
appengine ja night #6 - @ashigeru 162010/03/19
順次ローカルトランザクション (2)
チケットが売り切れていた場合
順番を逆にすると「残高が足らない場合」
補償トランザクションで払い戻しが必要
appengine ja night #6 - @ashigeru 172010/03/19
並行ローカルトランザクション
早めにチケットの残数を確認
17
appengine ja night #6 - @ashigeru 182010/03/19
並行ローカルトランザクション (1)
ローカルトランザクションを同時に実行
独占しながら先に前提条件を確認
appengine ja night #6 - @ashigeru 192010/03/19
並行ローカルトランザクション (2)
コミットが成功するとは限らない
30秒ルール + 楽観的並行性制御
結局この場合も払い戻しが必要
appengine ja night #6 - @ashigeru 202010/03/19
準備と適用
成功するまで繰り返せるように
20
appengine ja night #6 - @ashigeru 212010/03/19
準備と適用 (1)
ログを保存してから適用
途中で失敗してもログから復帰可能
appengine ja night #6 - @ashigeru 222010/03/19
準備と適用 (2)
適用に失敗しても再試行すればいい
タスクキューを使えば自動的に再試行
appengine ja night #6 - @ashigeru 232010/03/19
準備と適用 (3)
準備に失敗したらログを捨てる
rollback
appengine ja night #6 - @ashigeru 242010/03/19
準備と適用 (4)
準備と適用の間に割り込まれる
独占していない状態がある
appengine ja night #6 - @ashigeru 252010/03/19
排他制御の導入
準備したものを排他制御で独占
25
appengine ja night #6 - @ashigeru 262010/03/19
準備と適用の排他制御 (1)
ソフトウェアで排他制御を行う
準備から適用までをロックする
appengine ja night #6 - @ashigeru 272010/03/19
準備 + ロック取得
ユニークにロックエンティティを作成
作成できない場合は他人がロック中 (排他)
appengine ja night #6 - @ashigeru 282010/03/19
適用 + ロック開放
ユニークにロックを開放しつつ適用処理
存在しない場合は処理済み (べき等)
appengine ja night #6 - @ashigeru 292010/03/19
準備と適用の排他制御 (2)
Commit / Abort ?
インダウトな状態から復元できない
appengine ja night #6 - @ashigeru 302010/03/19
状態の保持
Commit / Abort を区別できるようにする
30
appengine ja night #6 - @ashigeru 312010/03/19
2相コミット (1)
トランザクションの状態も記録
これでほぼ2相コミットと同じ状態
appengine ja night #6 - @ashigeru 322010/03/19
2相コミット (2)
「Committed」なら絶対に適用する
ACIDのDurabilityを保証
appengine ja night #6 - @ashigeru 332010/03/19
2相コミット (2)
「Aborted」なら絶対に適用しない
ロックだけ開放
appengine ja night #6 - @ashigeru 342010/03/19
2相コミット (3)
長時間不明なら「Aborted」にする
ロックの開放漏れを防ぐ
appengine ja night #6 - @ashigeru 352010/03/19
Slim3 Global Transaction
2相コミットプロトコルが基礎
でも Local Tx * 5 より明らかに速い!
appengine ja night #6 - @ashigeru 362010/03/19
まとめ
36
appengine ja night #6 - @ashigeru 372010/03/19
前半の終了
2相コミットはそれなりに重い
ロック取得、ログ作成、コミット、ログ適用、ロック開放
まともに実装すると( 2 * EGs + 1 )回のローカルトランザクションが必要
Slim3 Global Transactionは2相コミットを基礎
得られる効果は今回の内容と同じ
しかも妙に速い
最適化や個々の実装については後半に
appengine ja night #6 - @ashigeru 382010/03/19
参考資料
トランザクション処理(下) – 概念と技法
ジム グレイほか, 日経BP社, 2001年
リレーショナルデータベース入門
増永 良文, サイエンス社, 2003年
Transaction Puzzlers (手前味噌)
http://www.slideshare.net/ashigeru/ajn4
appengine ja night #6 - @ashigeru 392010/03/19
Question and Discussion
後半戦に入る前に
39
appengine ja night #6 - @ashigeru 402010/03/19
グローバルトランザクションの制限
時間が余ったら
40
appengine ja night #6 - @ashigeru 412010/03/19
ローカルトランザクションと併用不可
通常のltxはgtxのロックを見ない
Prepare → Apply のタイミングに割り込める
appengine ja night #6 - @ashigeru 422010/03/19
クエリのinconsistent windowが長い
クエリはgtxのロックを見ない
Apply中にクラッシュすると、続きはTQで
appengine ja night #6 - @ashigeru 432010/03/19
単一EG操作のスループットが悪化
EGの独占時間が長くなる
短時間に大量のチケットをさばけない