背景
ホームページのRSSを取得して、LINE公式アカウントで配信する処理を、Azure Logic Apps を使って実装していたのですが、RSSで取得した情報を順番に並べて、LINEメッセージとして配信すると、なぜかRSSで取得した情報の日付の並び順がおかしい。もとのRSSを確認しても日付順で並んでいて、Azure Logic Apps の処理のログを確認しても、For each 内の処理も日付順で並んでおり、配信されたメッセージのみが順番がおかしくなっている感じでした。
今回は、その原因と対応方法について説明します。
原因
Azure Logic Apps の For each は、配列やコレクションの各要素に対して処理を繰り返すことができます。今回は、RSSで取得した一覧に対して、この繰り返し処理を行っていました。
順番がおかしくなったように見えていた原因は、「For each のデフォルトの動作が並列処理である」からでした。
対応方法
For each の設定で、コンカレンシー制御をONにして、順次処理を1にすることで、順次処理することが出来ます。
コンカレンシー制御をONにすると、For each が同時に実行できるインスタンスの数を指定できます。 この数値を1にすると、For each は一度に1つの要素しか処理しなくなります。 つまり、順次処理になります。 順次処理では、各要素の処理が前の要素の処理が終了した後に開始されます。 そのため、出力の順番が入力の順番と一致します。
設定方法
設定方法は、以下のとおりです。
これで、For each ループは一度に1つの要素しか処理しなくなります。つまり、順次処理になります。順次処理では、各要素の処理が前の要素の処理が終了した後に開始され、出力の順番が入力の順番と一致するので、今回発生したようなことは起きなくなります。
デメリット
ただし、コンカレンシー制御をONにして、順次処理を1にすることにはデメリットもあります。 それは、処理時間が長くなることです。 並列処理では、各要素の処理が同時に開始されるため、全体の処理時間は最も時間のかかる要素の処理時間に近くなります。 しかし、順次処理では、各要素の処理時間が全体の処理時間に加算されます。そのため、全体の処理時間は各要素の処理時間の合計に近くなります。 特に、要素数が多い場合や各要素の処理時間が長い場合は、並列処理と比べて大きな差が出る可能性があります。
よって、For each の順番を保証したい場合は、コンカレンシー制御をONにして、順次処理を1にすることで実現できますが、その分、処理時間が長くなることを覚えておきましょう。
参考URL
参考にしたURLを掲載しておきます。