準備と適用

Download Report

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