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