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