SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
図解
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   5
                                                 5
トランザクション処理の考え方
   リソースを一時的に独占できる技術
     同時に変更して不整合が起こる、などを回避


   すべて成功するか、すべて失敗するか
     中途半端に終わらない
     アトミック性    (ACIDのA)




2010/03/19   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相コミットプロトコルが基礎
     でも     Local Tx * 5 より明らかに速い!




2010/03/19       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   → Apply のタイミングに割り込める




2010/03/19        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

Contenu connexe

Similaire à appengine ja night #6 図解Global Transaction

Jupyter Notebookを納品した話
Jupyter Notebookを納品した話Jupyter Notebookを納品した話
Jupyter Notebookを納品した話Hiroki Yamamoto
 
OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介Hiromu Yakura
 
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?Masamitsu Maehara
 
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオンAzure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオンYasuaki Matsuda
 
T100TAにLinuxを「Windowsなしで」インストールする
T100TAにLinuxを「Windowsなしで」インストールするT100TAにLinuxを「Windowsなしで」インストールする
T100TAにLinuxを「Windowsなしで」インストールするMasataka Kondo
 
運用アナリティクスを実現!最新Hinemos ver.6.1の全体像
運用アナリティクスを実現!最新Hinemos ver.6.1の全体像運用アナリティクスを実現!最新Hinemos ver.6.1の全体像
運用アナリティクスを実現!最新Hinemos ver.6.1の全体像Hinemos
 
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―Hisao Soyama
 
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~Takanori Suzuki
 
テスト駆動開発のはじめ方
テスト駆動開発のはじめ方テスト駆動開発のはじめ方
テスト駆動開発のはじめ方Shuji Watanabe
 
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理Kouji Matsui
 
最近のTremaを触ってみてちょっとはまったこととか
最近のTremaを触ってみてちょっとはまったこととか最近のTremaを触ってみてちょっとはまったこととか
最近のTremaを触ってみてちょっとはまったこととかM Hagiwara
 
第21回八子クラウド座談会資料(討議メモ付き) 20161022
第21回八子クラウド座談会資料(討議メモ付き) 20161022第21回八子クラウド座談会資料(討議メモ付き) 20161022
第21回八子クラウド座談会資料(討議メモ付き) 20161022知礼 八子
 
230517_chatGPT_v01.pdf
230517_chatGPT_v01.pdf230517_chatGPT_v01.pdf
230517_chatGPT_v01.pdfSatoshi Kume
 
インプットメソッドメンテナーの日常
インプットメソッドメンテナーの日常インプットメソッドメンテナーの日常
インプットメソッドメンテナーの日常Fuminobu Takeyama
 
Introduction to AR Foundation
Introduction to AR FoundationIntroduction to AR Foundation
Introduction to AR FoundationHirokazu Egashira
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 

Similaire à appengine ja night #6 図解Global Transaction (20)

Jupyter Notebookを納品した話
Jupyter Notebookを納品した話Jupyter Notebookを納品した話
Jupyter Notebookを納品した話
 
OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介
 
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
 
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオンAzure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオン
 
Inside MF
Inside MFInside MF
Inside MF
 
T100TAにLinuxを「Windowsなしで」インストールする
T100TAにLinuxを「Windowsなしで」インストールするT100TAにLinuxを「Windowsなしで」インストールする
T100TAにLinuxを「Windowsなしで」インストールする
 
Code injectiontool
Code injectiontoolCode injectiontool
Code injectiontool
 
運用アナリティクスを実現!最新Hinemos ver.6.1の全体像
運用アナリティクスを実現!最新Hinemos ver.6.1の全体像運用アナリティクスを実現!最新Hinemos ver.6.1の全体像
運用アナリティクスを実現!最新Hinemos ver.6.1の全体像
 
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
 
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
 
GroovyでJSON2015
GroovyでJSON2015GroovyでJSON2015
GroovyでJSON2015
 
テスト駆動開発のはじめ方
テスト駆動開発のはじめ方テスト駆動開発のはじめ方
テスト駆動開発のはじめ方
 
appengine活用事例資料@TDDBC札幌2.1
appengine活用事例資料@TDDBC札幌2.1appengine活用事例資料@TDDBC札幌2.1
appengine活用事例資料@TDDBC札幌2.1
 
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
最近のTremaを触ってみてちょっとはまったこととか
最近のTremaを触ってみてちょっとはまったこととか最近のTremaを触ってみてちょっとはまったこととか
最近のTremaを触ってみてちょっとはまったこととか
 
第21回八子クラウド座談会資料(討議メモ付き) 20161022
第21回八子クラウド座談会資料(討議メモ付き) 20161022第21回八子クラウド座談会資料(討議メモ付き) 20161022
第21回八子クラウド座談会資料(討議メモ付き) 20161022
 
230517_chatGPT_v01.pdf
230517_chatGPT_v01.pdf230517_chatGPT_v01.pdf
230517_chatGPT_v01.pdf
 
インプットメソッドメンテナーの日常
インプットメソッドメンテナーの日常インプットメソッドメンテナーの日常
インプットメソッドメンテナーの日常
 
Introduction to AR Foundation
Introduction to AR FoundationIntroduction to AR Foundation
Introduction to AR Foundation
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 

appengine ja night #6 図解Global Transaction