1 / 43

図解 Global Transaction

図解 Global Transaction. appengine ja night #6 あらかわ (@ashigeru). 講演者について. 名前 あらかわ (@ashigeru) 所属 株式会社グルージェント 開発部 普段の業務 教育 (Computer Aided Education) 研究開発 ( コンパイラ系 ) ブログ書き (Song of Cloud Blog). 祝 Slim3 1.0.0 Released. “The main features of Slim3 are as follows: Global Transactions

Download Presentation

図解 Global Transaction

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 講演者について • 名前 • あらかわ (@ashigeru) • 所属 • 株式会社グルージェント 開発部 • 普段の業務 • 教育 (Computer Aided Education) • 研究開発 (コンパイラ系) • ブログ書き (Song of Cloud Blog) appengine ja night #6 - @ashigeru

  3. 祝 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” appengine ja night #6 - @ashigeru

  4. 今日の内容 • トランザクションの基礎 • グローバルトランザクションの仕組み • グローバルトランザクションの制限 • 今回のルール • 最適化に関するネタバレなし • 30分ルールでしゃべる • DSL禁止 appengine ja night #6 - @ashigeru

  5. トランザクションの基礎 まずはおさらい appengine ja night #6 - @ashigeru 5

  6. トランザクション処理の考え方 • リソースを一時的に独占できる技術 • 同時に変更して不整合が起こる、などを回避 • すべて成功するか、すべて失敗するか • 中途半端に終わらない • アトミック性 (ACIDのA) appengine ja night #6 - @ashigeru

  7. App Engineのトランザクション • Entity Group (EG) ごとのローカルトランザクション • ACID特性を持つ • 楽観的並行性制御 • 難点 • 2つ以上のEGをまたいだ操作ができない • エンティティは作成後EGを変更できない • EGに含まれるエンティティを全て独占 appengine ja night #6 - @ashigeru

  8. モデリングの例 (1) • チケットをポイントで買うシステム • ユーザごとにポイントの口座がある • ポイントを消費してチケットを買える • ポイントが足りないとチケットを買えない • チケットは数に限りがある appengine ja night #6 - @ashigeru

  9. モデリングの例 (2) • 全ての人が全てのチケットを買える • 同時に操作する可能性があれば同一EGへ appengine ja night #6 - @ashigeru

  10. ローカルトランザクションの問題 • EG設計が難しい • 同時に操作するものを同じEGに • EG内のエンティティを全て独占 appengine ja night #6 - @ashigeru

  11. グローバルトランザクションの仕組み トランザクションプロトコルの設計を段階的に appengine ja night #6 - @ashigeru 11

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

  13. 説明の進め方 • うまくいかない実装方法を中心に紹介 • ちゃんと動いている例は後半戦で • 今回利用する題材 • Aliceがチケット「ajn6」を購入 • チケット「ajn6」は500ポイント消費 • Aliceの残りポイントが500を切ると買えない • チケット「ajn6」は数に限りがある ※appengine ja night #6 は参加無料です appengine ja night #6 - @ashigeru

  14. 順次ローカルトランザクション まずはダメな例から appengine ja night #6 - @ashigeru 14

  15. 順次ローカルトランザクション (1) • ローカルトランザクションを順番に実行 appengine ja night #6 - @ashigeru

  16. 順次ローカルトランザクション (2) • チケットが売り切れていた場合 • 順番を逆にすると「残高が足らない場合」 • 補償トランザクションで払い戻しが必要 appengine ja night #6 - @ashigeru

  17. 並行ローカルトランザクション 早めにチケットの残数を確認 appengine ja night #6 - @ashigeru 17

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

  19. 並行ローカルトランザクション (2) • コミットが成功するとは限らない • 30秒ルール + 楽観的並行性制御 • 結局この場合も払い戻しが必要 appengine ja night #6 - @ashigeru

  20. 準備と適用 成功するまで繰り返せるように appengine ja night #6 - @ashigeru 20

  21. 準備と適用 (1) • ログを保存してから適用 • 途中で失敗してもログから復帰可能 appengine ja night #6 - @ashigeru

  22. 準備と適用 (2) • 適用に失敗しても再試行すればいい • タスクキューを使えば自動的に再試行 appengine ja night #6 - @ashigeru

  23. 準備と適用 (3) • 準備に失敗したらログを捨てる • rollback appengine ja night #6 - @ashigeru

  24. 準備と適用 (4) • 準備と適用の間に割り込まれる • 独占していない状態がある appengine ja night #6 - @ashigeru

  25. 排他制御の導入 準備したものを排他制御で独占 appengine ja night #6 - @ashigeru 25

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

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

  28. 適用 + ロック開放 • ユニークにロックを開放しつつ適用処理 • 存在しない場合は処理済み (べき等) appengine ja night #6 - @ashigeru

  29. 準備と適用の排他制御 (2) • Commit / Abort ? • インダウトな状態から復元できない appengine ja night #6 - @ashigeru

  30. 状態の保持 Commit / Abort を区別できるようにする appengine ja night #6 - @ashigeru 30

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

  32. 2相コミット (2) • 「Committed」なら絶対に適用する • ACIDのDurabilityを保証 appengine ja night #6 - @ashigeru

  33. 2相コミット (2) • 「Aborted」なら絶対に適用しない • ロックだけ開放 appengine ja night #6 - @ashigeru

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

  35. Slim3 Global Transaction • 2相コミットプロトコルが基礎 • でも Local Tx * 5 より明らかに速い! appengine ja night #6 - @ashigeru

  36. まとめ appengine ja night #6 - @ashigeru 36

  37. 前半の終了 • 2相コミットはそれなりに重い • ロック取得、ログ作成、コミット、ログ適用、ロック開放 • まともに実装すると( 2 * EGs + 1 )回のローカルトランザクションが必要 • Slim3 Global Transactionは2相コミットを基礎 • 得られる効果は今回の内容と同じ • しかも妙に速い • 最適化や個々の実装については後半に appengine ja night #6 - @ashigeru

  38. 参考資料 • トランザクション処理(下) – 概念と技法 • ジム グレイほか, 日経BP社, 2001年 • リレーショナルデータベース入門 • 増永 良文, サイエンス社, 2003年 • Transaction Puzzlers (手前味噌) • http://www.slideshare.net/ashigeru/ajn4 appengine ja night #6 - @ashigeru

  39. Question and Discussion 後半戦に入る前に appengine ja night #6 - @ashigeru 39

  40. グローバルトランザクションの制限 時間が余ったら appengine ja night #6 - @ashigeru 40

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

  42. クエリのinconsistent windowが長い • クエリはgtxのロックを見ない • Apply中にクラッシュすると、続きはTQで appengine ja night #6 - @ashigeru

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

More Related