AzureFunctions

Azure Functionsでのトリガーの流量制御

ストレージキュートリガーとかサービスバストリガーとかの場合、デフォルトで1インスタンスあたりの同時実行数は16。

従量課金プランやAppServiceプランの複数インスタンス環境ではインスタンス数倍となる。

ひたすらにスピードを求める処理の場合にはどんどんスケールしてくれればいいけど、APIアクセスなどで相手方を労わらなければならない場合には流量制御が必要になる。

方法論としてはサービスバスキューでもストレージキューでもhost.jsonでbatchSizeを指定すれば、1インスタンスあたりの同時実行数を指定することができる。

けれどインスタンスがスケールしてしまう場合には厳密に指定できない。

そこでSingletonAttributeを用いる。

https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton

SingletonAttributeを使うとデフォルト設定の場合にはトリガー実行時にロック制御を行い、一つのFunctionしか実行されなくなる。

インスタンス関係なく同時実行数は1。

ただしオーバーヘッドが結構ある。 正確には測ってないけど処理結果を見てる感じだと700msecくらいオーバーヘッドありそう。

SingletonAttributeをSingletonMode = Listnerで使用するとスケールする環境だとしても設定した関数は1インスタンスでのみリスニングが行われるので実質1インスタンスでの実行を保証できる。

よってスケールしてしまう環境下で同時実行数を制御したい場合にはSingletonAttribute(Mode=Listner) + BatchSizeの指定が最もコントロールしやすい設定でないかと思う。