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