retry monad for transient fault handling

29
Retry Monad for Transient Fault Handling F#Windows Azure と私 2012.04.14 #CLRH69 ぜくる/@zecl

Upload: zecl1231

Post on 28-May-2015

2.495 views

Category:

Documents


0 download

DESCRIPTION

CLR/H 69 LTMSDN - Code Recipehttp://code.msdn.microsoft.com/F-Retry-Monad-for-35ee1e72

TRANSCRIPT

Page 1: Retry monad for transient fault handling

Retry Monad

for Transient Fault Handling

F#とWindows Azure と私

2012.04.14 #CLRH69 ぜくる/@zecl

Page 2: Retry monad for transient fault handling

ぜくる

twitter : @zecl

• 北海道旭川市在住の.NET系プログラマ。オブ

ジェクト指向を得意としながらも、ここ数年、関数型言語に魅了されています。

• F#が大好きです。

• Windows Azure と ASP.NET MVC3を利用した開発のお仕事をしています。

Page 3: Retry monad for transient fault handling

???

Page 4: Retry monad for transient fault handling

ところで、Windows Azure いいですよね

年賀状いただきました。

Page 5: Retry monad for transient fault handling

でも、いいことばかりじゃない。

• クラウドアプリケーションだと、気をつけなくちゃいけないことがたくさんあるよね。

Page 6: Retry monad for transient fault handling

Transient Fault Handling

• 他のクラウドサービスに依存するようなクラウドアプリケーションを開発する場合、開発者が対処しなければならない課題の一つに、

“一時的な障害”がある。

インフラストラクチャレベルの障害だったり、ネットワークの問題など一時的な条件のために発生する障害のことです。

Page 7: Retry monad for transient fault handling

SQL Azureが接続を切断するケース

過剰な

リソースの使用

実行時間の長いクエリ

1 回の実行時間が長いトランザ

クション

接続の

アイドル状態

Page 8: Retry monad for transient fault handling

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

Microsoft Enterprise Library 5.0

Integration Pack for Windows Azure

• Autoscaling Application Block (WASABi)

利用時間帯やサーバー負荷のパターンに合わせてルールを設定し、そのルールをログから評価して自動スケールなどを設定できるアプリケーションブロック。

Page 10: Retry monad for transient fault handling

Topazの主要な構成要素

• 検出戦略(カスタマイズ可能)

ITransientErrorDetectionStrategyインターフェイスを実装して作成

• 再試行戦略(カスタマイズ可能)

RetryStrategy抽象クラスを継承して作成

検出戦略 + 再試行戦略 = RetryPolicy

Page 11: Retry monad for transient fault handling

基本的な使い方(C#)

Page 12: Retry monad for transient fault handling

4つの組み込み検出戦略

• SQL Azure

SqlAzureTransientErrorDetectionStrategy

• Windows Azure ストレージサービス

StorageTransientErrorDetectionStrategy

• Windows Azure サービスバス

ServiceBusTransientErrorDetectionStrategy

• Windows Azure キャッシングサービス

CacheTransientErrorDetectionStrategy

Page 13: Retry monad for transient fault handling

F#でクラウドと言えば・・・

Page 14: Retry monad for transient fault handling

M-Brace

cloudモナド が話題に… (・∀・)イイネ!

Page 15: Retry monad for transient fault handling

モナドって何ですか?

Page 16: Retry monad for transient fault handling

フィリップ・ワドラー

モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?

Page 17: Retry monad for transient fault handling

モナド則

• return x >>= f == f x

• m >>= return == m

• (m >>= f) >>= g == m >>= (¥x -> f x >>= g)

Page 18: Retry monad for transient fault handling

モナド則(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

モナド則(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

モナド則って何を言わんとしている?

•左右単位元 return が存在し、

且つ結合法則が成立するもの

Page 21: Retry monad for transient fault handling

Retry Monad

for Transient Fault Handling

とはなんですか?

わたしが考えたオリジナルのモナド

一時的障害が発生するかもしれない計算について、異なるポリシーを適用しながらリトライ処理を行い、ひとつの計算として包括的に扱うことができるモナド。 RetryMonadの計算結果はChoice<’T1,’T2>型で得ることができ、Eitherモナドで処理することができる。

Page 22: Retry monad for transient fault handling

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
Page 24: Retry monad for transient fault handling
Page 25: Retry monad for transient fault handling
Page 26: Retry monad for transient fault handling
Page 27: Retry monad for transient fault handling
Page 28: Retry monad for transient fault handling
Page 29: Retry monad for transient fault handling

ソースコードを見てみましょう…