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