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