眠いしお腹すいたし(´・ω・`)

C#関連を主に書きます。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Azure Functions の SingletonAttributeとModeプロパティ

今日職場でSingletonAttributeのModeプロパティに関する話が出てたので検証してみました。

ソースコードはこちら

github.com

gist.github.com

TriggerTest1はSingleton(Mode=Function)

TriggerTest2はSingleton(Mode=Listner)

TriggerTest3はSingletonなし

動作環境はAppServiceプラン(S1 インスタンス数を10に固定)です。

まずはTest3のSingletonなしの結果から

f:id:tamafuyou:20171029151501p:plain

同じ時間に並列実行されています。またPartitionKeyもバラバラです。PartitionKeyにはstatic Lazyで作成されたGuidを設定していますのでGuidの違いは実行インスタンスの違いを表しています。要するにSingletonを付けないキュートリガー関数は複数のインスタンスでそれぞれ並列処理が行われる感じになります。今回の場合は10インスタンスなので10インスタンス * デフォルトサイズ16 なので、最大同時実行数は160になります。

続いてTest1の結果はこんな感じ

f:id:tamafuyou:20171029151547p:plain

Timeを見てみるとおおよそ秒毎に処理が実行されていますので、まさにシングル動作です。またPartitionKeyをみると結構バラバラです。

SingletonをFunctionモードで使用すると複数インスタンスであっても同時実行数1が保証される感じになります。

次にTest2の結果

f:id:tamafuyou:20171029151646p:plain

ingletonを使っているのに同じ時間帯にFunctionが実行されています。しかしPartitionKeyに注目してください。全て一緒です。

SingletonをListnerモードで使用すると単一のインスタンスでの実行が保証されます。今回の場合にはバッチサイズはデフォルトなので最大同時実行数は16になります。

ではListnerモードはどのように有効活用すると良いか? という事ですが、私自身、これだ!!っていう決定的な活用法は思いついていないのですが

qiita.com

こちらで書いたような同時実行の細かな制御を行うのに良いのかなぁとか思っています。