Submit Search
appengine ja night #6 図解Global Transaction
•
9 likes
•
1,471 views
S
Suguru ARAKAWA
Follow
#ajn6 で喋る予定の内容
Read less
Read more
1 of 43
Download now
Downloaded 38 times
More Related Content
appengine ja night #6 図解Global Transaction
1.
図解 Global Transaction appengine ja
night #6 あらかわ (@ashigeru)
2.
講演者について
名前 あらかわ (@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
4.
今日の内容 トランザクションの基礎 グローバルトランザクションの仕組み
グローバルトランザクションの制限 今回のルール 最適化に関するネタバレなし 30分ルールでしゃべる DSL禁止 2010/03/19 appengine ja night #6 - @ashigeru 4
5.
まずはおさらい トランザクションの基礎 2010/03/19
appengine ja night #6 - @ashigeru 5 5
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
11.
トランザクションプロトコルの設計を段階的に グローバルトランザクションの 仕組み 2010/03/19
appengine ja night #6 - @ashigeru 11 11
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
14.
まずはダメな例から 順次ローカルトランザクション 2010/03/19
appengine ja night #6 - @ashigeru 14 14
15.
順次ローカルトランザクション (1)
ローカルトランザクションを順番に実行 2010/03/19 appengine ja night #6 - @ashigeru 15
16.
順次ローカルトランザクション (2)
チケットが売り切れていた場合 順番を逆にすると「残高が足らない場合」 補償トランザクションで払い戻しが必要 2010/03/19 appengine ja night #6 - @ashigeru 16
17.
早めにチケットの残数を確認 並行ローカルトランザクション 2010/03/19
appengine ja night #6 - @ashigeru 17 17
18.
並行ローカルトランザクション (1)
ローカルトランザクションを同時に実行 独占しながら先に前提条件を確認 2010/03/19 appengine ja night #6 - @ashigeru 18
19.
並行ローカルトランザクション (2)
コミットが成功するとは限らない + 楽観的並行性制御 30秒ルール 結局この場合も払い戻しが必要 2010/03/19 appengine ja night #6 - @ashigeru 19
20.
成功するまで繰り返せるように 準備と適用 2010/03/19
appengine ja night #6 - @ashigeru 20 20
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
25.
準備したものを排他制御で独占 排他制御の導入 2010/03/19
appengine ja night #6 - @ashigeru 25 25
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
35.
Slim3 Global Transaction
2相コミットプロトコルが基礎 でも Local Tx * 5 より明らかに速い! 2010/03/19 appengine ja night #6 - @ashigeru 35
36.
まとめ 2010/03/19
appengine ja night #6 - @ashigeru 36 36
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
39.
後半戦に入る前に Question and
Discussion 2010/03/19 appengine ja night #6 - @ashigeru 39 39
40.
時間が余ったら グローバルトランザクションの 制限 2010/03/19
appengine ja night #6 - @ashigeru 40 40
41.
ローカルトランザクションと併用不可
通常のltxはgtxのロックを見ない Prepare → Apply のタイミングに割り込める 2010/03/19 appengine ja night #6 - @ashigeru 41
42.
クエリのinconsistent windowが長い
クエリはgtxのロックを見ない Apply中にクラッシュすると、続きはTQで 2010/03/19 appengine ja night #6 - @ashigeru 42
43.
単一EG操作のスループットが悪化
EGの独占時間が長くなる 短時間に大量のチケットをさばけない 2010/03/19 appengine ja night #6 - @ashigeru 43
Download