読者です 読者をやめる 読者になる 読者になる

に参加したよー

プログラム http://atnd.org/events/3228:title=appengine ja night #6

twitter
ust

あらかわさん (@ashigeru) さんによる「図解Global Transaction」

  • 赤木しげる呼ばわりされているwww
  • 株式会社 グルージェント
  • 教育、研究開発(コンパイラ系)、ブログ書き(
  • Song of Cloud Blog)
  • Slim3 1.0.0 Released
トランザクション処理の考え方
  • リソースを一時的に独占できる技術
  • 同時に変更して不整合が起こるなどを会費
  • すべて成功するか、すべて失敗するか
  • 中途半端に終わらない
  • アトミック性

  • 難点
    • 2つ以上のEGをまたいだ操作ができない
    • エンティティは作成後EGを変更できない
    • EGに含まれるエンティティをすべて独占
      • EGを大きくしすぎないようにする
モデリングの例(1)
  • チケットをポイントで買うシステム
    • ユーザごとにポイントの講座がある
    • ポイントを消費してチケットを買える
    • ポイントが足りないとチケットが買えない
    • チケットには限りがある
モデリングの例(2)
  • 全員が全部のチケットを買う可能性がある
  • ローカルトランザクションの問題
    • EG設計が難しい
      • 同時に操作するものを同じうEGに
      • EG内のエンティティをすべて独占!!
    • 20PPSがmaxじゃないだろうか
グローバルトランザクション
説明の進め方
  • うまくいかない実装方法を中心に紹介
    • ちゃんと動いている例は後半戦
順次ローカルトランザクション
並行ローカルトランザクション
  • ローカルトランザクションを同時に実行
    • 独占しながら先に前提条件を確認
    • コミットが成功するとは限らない
    • 30秒ルール+楽観的並行制御
準備と成功
  • ログを保存してから適用
    • 途中で失敗してもログから復帰可能
    • 適用に失敗してもログから再試行すればいい(task queue)で自動的に再実行
  • 準備に失敗したらログを捨てる
    • rollback (ジャーナルを書き出すrollforward)
  • 準備と適用の間に割り込まれる
    • 独占していない状態がある
排他制御の導入
  • ソフト側で排他制御を頑張る
    • ユニークにロックエンティティを作成
    • ロックの解放は「解放と適用を1つのトランザクション」として実行する
    • 問題:Commit / Abort ? インダウトな状態から復元できない
      • インダウトの状態は、ロックが掛かって、プログラム上でロールバック/ロールフォワードの情報が決まっている、ところで、落ちた場合に状態が紛失されるときに生じる
状態の保持
  • 2相コミット
    • Committedなら絶対に適用する
    • CommittedのEGを使う
      • ACIDのDurability
    • インダウトな状態ができないように、別EGに状態を保持しておく
      • CommitedなEGはユニーク制約で切り替える
    • Commitedかどうかを書き込む前に30秒ルールなどで落ちた場合に、長時間不明ならAbortedにする
      • rollbackする
Slim3 Global Transaction
  • 2相コミットは5項目も必要
    • ロック取得、ログ作成、コミット、ログ適用、ロック解放
    • まともに実装すると2*EGs+1回のトランザクション生じてしまう
参考文献
QA
  • read writeでtransaction外なら65msくらいだけど、transaction内では90msくらいかかっちゃう(ひがさん)

ひがさん

ソフトウェアロックの話
  • 3つのクラス(slim3)
  1. グローバルトランザクション
  2. ロック
  3. ログ
  • ロックのキーとプログラムで使うデータのキーを同時にとる
  • パフォーマンスは小さいことの積み重ね(RPCを減らす。一度のRPCで複数のデータを取る)
    • ロックのキーを取得できない、及びデータのキーが取得出来る、このキーを取得するまでに変更が入ったらどうなるの?
  • Journalの圧縮
    • 複数のエンティティをシリアライズ(GoogleAPIを使って)して、連結してひとつのエンティティになおして保存
    • そんで、そいつをput, get, deleteすることで相当効率がいい
  • やべえ、わかりきってない・・・コード読んで勉強する