図解
Global Transaction

appengine ja night #6
あらかわ (@ashigeru)
Slim3 1.0.0 Released!
   おめでとうございます

   “The main features of Slim3 are as follows:
     Global Transactions
     Fast...
講演者について
   名前
     あらかわ   (@ashigeru)
   所属
     株式会社グルージェント                       開発部
   普段の業務
     教育(Computer Aid...
今日の内容
 トランザクションの基礎
 グローバルトランザクションの仕組み
 グローバルトランザクションの制限


   今回のルール
     最適化に関するネタバレなし
     30分ルールでしゃべる
     DSL禁止
...
App Engineのローカルトランザクション

 トランザクションの基礎


2010/03/19   appengine ja night #6 - @ashigeru   5
                               ...
トランザクション処理の考え方
   リソースを一時的に独占できる技術
     同時に変更して不整合が起こる、などを回避


   すべて成功するか、すべて失敗するか
     中途半端に終わらない
     アトミック性    (A...
App Engineのトランザクション
   Entity Group (EG) ごとのローカルトラン
    ザクション
     ACID特性を持つ
     楽観的並行性制御

   難点
     2つ以上のEGをまたいだ操作...
モデリングの例 (1)
   チケットをポイントで買うシステム
     ユーザごとにポイントの口座がある
     ポイントを消費してチケットを買える
     チケットは数に限りがある
   例
     AliceはTicke...
モデリングの例 (2)
   全ての人が全てのチケットを買える
     同時に操作する可能性があれば同一EGへ




2010/03/19   appengine ja night #6 - @ashigeru   9
ローカルトランザクションの問題
   EGモデリングが非常に難しい
     同時に操作するものを同じEGに
     EG内のエンティティを全て独占




2010/03/19   appengine ja night #6 - @a...
トランザクションプロトコルの設計を段階的に

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

2010/03/19   appengine ja night #6 - @ashigeru   11
                         ...
グローバルトランザクション
   複数のEGにまたがるトランザクション
     参加するEGを選択して独占




2010/03/19   appengine ja night #6 - @ashigeru   12
説明の進め方
   うまくいかない実装方法を順に紹介
     ちゃんと動いている例は後半戦で


   今回利用する題材
     Aliceがチケット「ajn6」を購入
     チケット「ajn6」の価格は500ポイント
   ...
まずはローカルトランザクションを順番に実行

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


2010/03/19   appengine ja night #6 - @ashigeru   14
                             ...
順次ローカルトランザクション (1)
   ローカルトランザクションを順番に実行




2010/03/19   appengine ja night #6 - @ashigeru   15
順次ローカルトランザクション (2)
   チケットが売り切れていた場合
     順番を逆にすると、残高が足らない場合
     同じ理由でBASE向きでない




2010/03/19   appengine ja night #6...
順次ローカルトランザクション (3)
   ローカルトランザクションを並べただけ
    ではうまくいかない
     2つ目のトランザクションが失敗する



   この場合、補償トランザクションが必要
     Aliceのポイント...
あらかじめチケットが残ってるか確認する

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


2010/03/19   appengine ja night #6 - @ashigeru   18
                               ...
並行ローカルトランザクション (1)
   ローカルトランザクションを同時に実行
     独占しながら先に前提条件の確認




2010/03/19   appengine ja night #6 - @ashigeru   19
並行ローカルトランザクション (2)
   コミットが成功するとは限らない
     楽観的並行性制御
     30秒ルール




2010/03/19     appengine ja night #6 - @ashigeru   ...
並行ローカルトランザクション (3)
   ローカルトランザクションだけでは無理
     アトミック性を保証できない


   特にApp Engineはではうまくいかない
     楽観的並行性制御は最後に失敗がわかる
     ...
ポイントとチケットを準備してから、購入しよう

 準備と適用


2010/03/19   appengine ja night #6 - @ashigeru   22
                                     ...
準備と適用 (1)
   ログを保存してからあとで適用
     途中で失敗してもログから復帰できる




2010/03/19   appengine ja night #6 - @ashigeru   23
準備と適用 (2)
   適用に失敗しても再試行すればいい
     Idempotent   (べき等な処理)




2010/03/19         appengine ja night #6 - @ashigeru   24
準備と適用 (3)
   準備に失敗したらログを捨てる
     rollback




2010/03/19       appengine ja night #6 - @ashigeru   25
準備と適用 (4)
   準備と適用の間に割り込まれる
     独占していない状態




2010/03/19   appengine ja night #6 - @ashigeru   26
準備したものは排他制御で独占しよう

 排他制御の導入


2010/03/19   appengine ja night #6 - @ashigeru   27
                                        ...
準備と適用の排他制御 (1)
   ソフトウェアで排他制御を行う
     準備から適用までをロックする




2010/03/19   appengine ja night #6 - @ashigeru   28
準備 + ロック取得
   ユニークにロックエンティティを作成
     作成できない場合は他人がロック中                           (排他)




2010/03/19   appengine ja night...
適用 + ロック開放
   ロックを開放しつつ適用処理
     存在しない場合はロックが無効                             (べき等)




2010/03/19   appengine ja night #6...
準備と適用の排他制御 (2)
   Commit / Abort ?
     In-Doubt状態から復元できない




2010/03/19     appengine ja night #6 - @ashigeru   31
Commit / Abort を区別できるようにする

 状態の保持


2010/03/19   appengine ja night #6 - @ashigeru   32
                                 ...
2相コミット (1)
   トランザクションの状態も記録
     これでほぼ2相コミットと同じ状態




2010/03/19   appengine ja night #6 - @ashigeru   33
2相コミット (2)
   「Committed」なら絶対に適用する
     ACIDのDurabilityを保証




2010/03/19     appengine ja night #6 - @ashigeru   34
2相コミット (2)
   「Aborted」なら絶対に適用しない
     ロックだけは開放する




2010/03/19   appengine ja night #6 - @ashigeru   35
2相コミット (3)
   長時間不明なら「Aborted」にする
     ロックの開放漏れを防ぐ




2010/03/19   appengine ja night #6 - @ashigeru   36
まとめ


2010/03/19   appengine ja night #6 - @ashigeru   37
                                                  37
前半の終了
   2相コミットはそれなりに重い
     ロック取得、ログ作成、コミット、ログ適用、ロッ
      ク開放
     まともに実装すると( 2 * EGs + 1 )回のローカルトラ
      ンザクションが必要
 ...
後半戦に入る前に

 Question and Discussion


2010/03/19   appengine ja night #6 - @ashigeru   39
                                 ...
時間が余ったら

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

2010/03/19   appengine ja night #6 - @ashigeru   40
                                        ...
ローカルトランザクションと併用不可
   通常のltxはgtxのロックを見ない
     Prepare   → Apply のタイミングに割り込める




2010/03/19        appengine ja night #6 ...
クエリのinconsistent windowが長い
   クエリはgtxのロックを見ない
     Apply中にクラッシュすると、続きはTQで




2010/03/19   appengine ja night #6 - @ashi...
単一EG操作のスループットが悪化
   EGの独占時間が長くなる
     短時間に大量のチケットをさばけない




2010/03/19   appengine ja night #6 - @ashigeru   43
Upcoming SlideShare
Loading in...5
×

appengine ja night #6 図解Global Transaction

3,298

Published on

#ajn6 で喋る予定の内容

0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,298
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
36
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

Transcript of "appengine ja night #6 図解Global Transaction"

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

    Clipping is a handy way to collect important slides you want to go back to later.

×