Upload
honorato-hurley
View
35
Download
5
Embed Size (px)
DESCRIPTION
図解 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 - PowerPoint PPT Presentation
Citation preview
図解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 TransactionsFaster than JDO/JPAFast spin-upHOT reloadingType 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 の独占時間が長くなる
短時間に大量のチケットをさばけない