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