Download - Retry monad for transient fault handling
![Page 1: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/1.jpg)
Retry Monad
for Transient Fault Handling
F#とWindows Azure と私
2012.04.14 #CLRH69 ぜくる/@zecl
![Page 2: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/2.jpg)
ぜくる
twitter : @zecl
• 北海道旭川市在住の.NET系プログラマ。オブ
ジェクト指向を得意としながらも、ここ数年、関数型言語に魅了されています。
• F#が大好きです。
• Windows Azure と ASP.NET MVC3を利用した開発のお仕事をしています。
![Page 3: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/3.jpg)
???
![Page 4: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/4.jpg)
ところで、Windows Azure いいですよね
年賀状いただきました。
![Page 5: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/5.jpg)
でも、いいことばかりじゃない。
• クラウドアプリケーションだと、気をつけなくちゃいけないことがたくさんあるよね。
![Page 6: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/6.jpg)
Transient Fault Handling
• 他のクラウドサービスに依存するようなクラウドアプリケーションを開発する場合、開発者が対処しなければならない課題の一つに、
“一時的な障害”がある。
インフラストラクチャレベルの障害だったり、ネットワークの問題など一時的な条件のために発生する障害のことです。
![Page 7: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/7.jpg)
SQL Azureが接続を切断するケース
過剰な
リソースの使用
実行時間の長いクエリ
1 回の実行時間が長いトランザ
クション
接続の
アイドル状態
![Page 8: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/8.jpg)
Microsoft Enterprise Library 5.0
Integration Pack for Windows Azure
• Transient Fault Handling Application Block (Topaz)
Windows Azureのプラットフォームに含まれる
サービス利用時に発生する一時的なエラー(一時的/過度に発生するエラー)からWindows Azureア
プリケーションを回復させるために用意されたアプリケーションブロック。
![Page 9: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/9.jpg)
Microsoft Enterprise Library 5.0
Integration Pack for Windows Azure
• Autoscaling Application Block (WASABi)
利用時間帯やサーバー負荷のパターンに合わせてルールを設定し、そのルールをログから評価して自動スケールなどを設定できるアプリケーションブロック。
![Page 10: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/10.jpg)
Topazの主要な構成要素
• 検出戦略(カスタマイズ可能)
ITransientErrorDetectionStrategyインターフェイスを実装して作成
• 再試行戦略(カスタマイズ可能)
RetryStrategy抽象クラスを継承して作成
検出戦略 + 再試行戦略 = RetryPolicy
![Page 11: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/11.jpg)
基本的な使い方(C#)
![Page 12: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/12.jpg)
4つの組み込み検出戦略
• SQL Azure
SqlAzureTransientErrorDetectionStrategy
• Windows Azure ストレージサービス
StorageTransientErrorDetectionStrategy
• Windows Azure サービスバス
ServiceBusTransientErrorDetectionStrategy
• Windows Azure キャッシングサービス
CacheTransientErrorDetectionStrategy
![Page 13: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/13.jpg)
F#でクラウドと言えば・・・
![Page 14: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/14.jpg)
M-Brace
cloudモナド が話題に… (・∀・)イイネ!
![Page 15: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/15.jpg)
モナドって何ですか?
![Page 16: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/16.jpg)
フィリップ・ワドラー
モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?
![Page 17: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/17.jpg)
モナド則
• return x >>= f == f x
• m >>= return == m
• (m >>= f) >>= g == m >>= (¥x -> f x >>= g)
![Page 18: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/18.jpg)
モナド則(Haskellのdo記法で)
• do { v <- return x; f v } = do { f x }
• do { v <- m; return v } = do { m }
• do { x <- m;
y <- f x;
g y }
= do { y <- do { x <- m;
f x };
g y }
![Page 19: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/19.jpg)
モナド則(F#のコンピューテーション式で)
• builder.Bind(builder.Return(x), f) = f x
• builder.Bind(m, fun x -> builder.Return(x)) = m
• builder.Bind(builder.Bind(m, f), g)
= builder.Bind(m, fun x -> builder.Bind(f x, g))
![Page 20: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/20.jpg)
モナド則って何を言わんとしている?
•左右単位元 return が存在し、
且つ結合法則が成立するもの
![Page 21: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/21.jpg)
Retry Monad
for Transient Fault Handling
とはなんですか?
わたしが考えたオリジナルのモナド
一時的障害が発生するかもしれない計算について、異なるポリシーを適用しながらリトライ処理を行い、ひとつの計算として包括的に扱うことができるモナド。 RetryMonadの計算結果はChoice<’T1,’T2>型で得ることができ、Eitherモナドで処理することができる。
![Page 22: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/22.jpg)
OOPとFPのライブラリのチカラを借りよう
• Microsoft.Practices.TransientFaultHandling.Core
MS EL 5 Integration Pack for Windows Azureの心臓部。WASABiとTopazを含むC#(オブジェクト指向プログラミング)で書かれたライブラリ。
• Fsharpx.Core
Fsharpxの心臓部。標準的なモナドの実装などを含むF#(関数プログラミング)で書かれたライブラリ。
![Page 23: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/23.jpg)
![Page 24: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/24.jpg)
![Page 25: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/25.jpg)
![Page 26: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/26.jpg)
![Page 27: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/27.jpg)
![Page 28: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/28.jpg)
![Page 29: Retry monad for transient fault handling](https://reader034.vdocuments.pub/reader034/viewer/2022052619/5565ff53d8b42a2a4d8b4d6e/html5/thumbnails/29.jpg)
ソースコードを見てみましょう…