appengine ja night #6 図解global transaction

43
図解 Global Transaction appengine ja night #6 あらかわ (@ashigeru)

Upload: suguru-arakawa

Post on 02-Jul-2015

3.273 views

Category:

Technology


0 download

DESCRIPTION

#ajn6 で喋る予定の内容

TRANSCRIPT

Page 1: appengine ja night #6 図解Global Transaction

図解

Global Transaction

appengine ja night #6

あらかわ (@ashigeru)

Page 2: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 22010/03/19

講演者について

名前

あらかわ (@ashigeru)

所属

株式会社グルージェント 開発部

普段の業務

教育 (Computer Aided Education)

研究開発 (コンパイラ系)

ブログ書き (Song of Cloud Blog)

Page 3: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 32010/03/19

祝 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”

Page 4: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 42010/03/19

今日の内容

トランザクションの基礎

グローバルトランザクションの仕組み

グローバルトランザクションの制限

今回のルール最適化に関するネタバレなし

30分ルールでしゃべる

DSL禁止

Page 5: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 52010/03/19

トランザクションの基礎

まずはおさらい

5

Page 6: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 62010/03/19

トランザクション処理の考え方

リソースを一時的に独占できる技術

同時に変更して不整合が起こる、などを回避

すべて成功するか、すべて失敗するか

中途半端に終わらない

アトミック性 (ACIDのA)

Page 7: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 72010/03/19

App Engineのトランザクション

Entity Group (EG) ごとのローカルトランザクション

ACID特性を持つ

楽観的並行性制御

難点

2つ以上のEGをまたいだ操作ができない

エンティティは作成後EGを変更できない

EGに含まれるエンティティを全て独占

Page 8: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 82010/03/19

モデリングの例 (1)

チケットをポイントで買うシステム

ユーザごとにポイントの口座がある

ポイントを消費してチケットを買える

ポイントが足りないとチケットを買えない

チケットは数に限りがある

Page 9: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 92010/03/19

モデリングの例 (2)

全ての人が全てのチケットを買える

同時に操作する可能性があれば同一EGへ

Page 10: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 102010/03/19

ローカルトランザクションの問題

EG設計が難しい

同時に操作するものを同じEGに

EG内のエンティティを全て独占

Page 11: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 112010/03/19

グローバルトランザクションの仕組み

トランザクションプロトコルの設計を段階的に

11

Page 12: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 122010/03/19

グローバルトランザクション

複数のEGにまたがるトランザクション

参加するEGを選択して独占

Page 13: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 132010/03/19

説明の進め方

うまくいかない実装方法を中心に紹介

ちゃんと動いている例は後半戦で

今回利用する題材

Aliceがチケット「ajn6」を購入

チケット「ajn6」は500ポイント消費

Aliceの残りポイントが500を切ると買えない

チケット「ajn6」は数に限りがある

※appengine ja night #6 は参加無料です

Page 14: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 142010/03/19

順次ローカルトランザクション

まずはダメな例から

14

Page 15: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 152010/03/19

順次ローカルトランザクション (1)

ローカルトランザクションを順番に実行

Page 16: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 162010/03/19

順次ローカルトランザクション (2)

チケットが売り切れていた場合

順番を逆にすると「残高が足らない場合」

補償トランザクションで払い戻しが必要

Page 17: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 172010/03/19

並行ローカルトランザクション

早めにチケットの残数を確認

17

Page 18: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 182010/03/19

並行ローカルトランザクション (1)

ローカルトランザクションを同時に実行

独占しながら先に前提条件を確認

Page 19: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 192010/03/19

並行ローカルトランザクション (2)

コミットが成功するとは限らない

30秒ルール + 楽観的並行性制御

結局この場合も払い戻しが必要

Page 20: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 202010/03/19

準備と適用

成功するまで繰り返せるように

20

Page 21: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 212010/03/19

準備と適用 (1)

ログを保存してから適用

途中で失敗してもログから復帰可能

Page 22: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 222010/03/19

準備と適用 (2)

適用に失敗しても再試行すればいい

タスクキューを使えば自動的に再試行

Page 23: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 232010/03/19

準備と適用 (3)

準備に失敗したらログを捨てる

rollback

Page 24: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 242010/03/19

準備と適用 (4)

準備と適用の間に割り込まれる

独占していない状態がある

Page 25: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 252010/03/19

排他制御の導入

準備したものを排他制御で独占

25

Page 26: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 262010/03/19

準備と適用の排他制御 (1)

ソフトウェアで排他制御を行う

準備から適用までをロックする

Page 27: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 272010/03/19

準備 + ロック取得

ユニークにロックエンティティを作成

作成できない場合は他人がロック中 (排他)

Page 28: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 282010/03/19

適用 + ロック開放

ユニークにロックを開放しつつ適用処理

存在しない場合は処理済み (べき等)

Page 29: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 292010/03/19

準備と適用の排他制御 (2)

Commit / Abort ?

インダウトな状態から復元できない

Page 30: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 302010/03/19

状態の保持

Commit / Abort を区別できるようにする

30

Page 31: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 312010/03/19

2相コミット (1)

トランザクションの状態も記録

これでほぼ2相コミットと同じ状態

Page 32: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 322010/03/19

2相コミット (2)

「Committed」なら絶対に適用する

ACIDのDurabilityを保証

Page 33: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 332010/03/19

2相コミット (2)

「Aborted」なら絶対に適用しない

ロックだけ開放

Page 34: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 342010/03/19

2相コミット (3)

長時間不明なら「Aborted」にする

ロックの開放漏れを防ぐ

Page 35: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 352010/03/19

Slim3 Global Transaction

2相コミットプロトコルが基礎

でも Local Tx * 5 より明らかに速い!

Page 36: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 362010/03/19

まとめ

36

Page 37: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 372010/03/19

前半の終了

2相コミットはそれなりに重い

ロック取得、ログ作成、コミット、ログ適用、ロック開放

まともに実装すると( 2 * EGs + 1 )回のローカルトランザクションが必要

Slim3 Global Transactionは2相コミットを基礎

得られる効果は今回の内容と同じ

しかも妙に速い

最適化や個々の実装については後半に

Page 38: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 382010/03/19

参考資料

トランザクション処理(下) – 概念と技法

ジム グレイほか, 日経BP社, 2001年

リレーショナルデータベース入門

増永 良文, サイエンス社, 2003年

Transaction Puzzlers (手前味噌)

http://www.slideshare.net/ashigeru/ajn4

Page 39: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 392010/03/19

Question and Discussion

後半戦に入る前に

39

Page 40: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 402010/03/19

グローバルトランザクションの制限

時間が余ったら

40

Page 41: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 412010/03/19

ローカルトランザクションと併用不可

通常のltxはgtxのロックを見ない

Prepare → Apply のタイミングに割り込める

Page 42: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 422010/03/19

クエリのinconsistent windowが長い

クエリはgtxのロックを見ない

Apply中にクラッシュすると、続きはTQで

Page 43: appengine ja night #6 図解Global Transaction

appengine ja night #6 - @ashigeru 432010/03/19

単一EG操作のスループットが悪化

EGの独占時間が長くなる

短時間に大量のチケットをさばけない