2018年6月18日月曜日

Logic Apps / Flow で長い時間が必要な処理に対応する

とあるから「Logic Apps のタイムアウト 120 秒、なんとかならんですか」という質問が飛んできたので、面白そうなのもあり試してみました。

仕様として Logic Apps のアクションにはタイムアウト制限が付いて回ります。コネクタによって若干の違いはあるかもしれませんが、基本的には 120 秒が一つの制限として存在しています。そのためそれを超える時間が必要な処理においては、非同期パターンを用いる必要があるので、Logic Apps だけでその状況を試してみました。

image_thumb20

大本となる LogicFlow をこのように作成します。イメージとしては、ここで HTTP にて呼び出す処理が長時間必要なものです。

image_thumb23

まず呼び出される LogicFlow はこのような形にします。ここで応答アクションとして、retry-after に再試行秒数を、location に処理状況を確認するために呼び出してほしい URL をセットします。

image_thumb26

最後に処理状況を戻すための LogicFlow をこのような形で作成します。お試しだったので、現在時刻をみて適当なタイミングであれば結果として 200 を、そうでなければ 202 としてまた状況確認用の URL を返却するものです。なお、この時の HTTP Request トリガですが、GET でアクセスできるようにする必要があります。Logic Apps の仕様として、location で指定された URL には GET でアクセスする、というのがあるためです。

image_thumb16

大本の LogicFlow では、上記のように 120 秒を超えても実行が続いていたのがわかります。

image_thumb17

2 つめの LogicFlow では、最初に大本から呼び出された後は、呼び出された形跡が残っていないのがわかります。

image_thumb11

3 つめの状況を返却する LogicFlow では、このように Retry-after で指定した間隔でアクセスが行われているのがわかります。

このような形で、処理をくみ上げていくことで 120 秒を超える処理時間にも対応が取れます。実際に利用する場合は、2つ目の LogicFlow では 202 で応答を返した後に時間が必要な処理を開始、処理状況は別途ストレージなどに記録。3 つ目の LogicFlow では記録されている状況を確認しつつ、処理終了したならば結果を返却する、そういった形が適しているかと思います。

カスタム API を含めて構築すれば、もっと手軽に長時間必要な処理を扱う LogicFlow も作成できるものと思います。

0 件のコメント:

コメントを投稿