3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Microsoft Azure TechAdvent Calendar 2023

Day 9

Standard Logic Apps、Stateless ってなにそれおいしいの?

Posted at

こんにちは! ERP 界隈から転職してまいりましてはや一年と少々の山田です。師走の第一土曜日皆様元気にお過ごしでしょうか。

この記事は Microsoft Azure Techのカレンダー | Advent Calendar 2023 - Qiita の 9 日目の記事です。

ひとまず Logic Apps の宣伝から

Logic Apps 使うなら Standard、Standard 使うなら、Standard ならではの機能…

「ステートフルおよびステートレス ワークフロー」です。

ステートフル (Stateful) と ステートレス (Stateless)

image.png

ステートフル ワークフローは、ステートレス ワークフローよりもはるかに長い間実行を継続できます。

ステートレス ワークフローは、"合計" サイズが 64 KB を超えないファイルなどのデータやコンテンツを処理する際に、最高のパフォーマンスを発揮します。

ということで両者 Stateful、Stateless を比較してみました。

予選

Stateful で FizzBuzz

ひとまず FizzBuzz 的なことをしてみます。
image.png

For_eachrange(1,100): こちらの式で 100 回処理を行えます (小ネタ)。処理をシーケンシャルにするには以下もご確認のほど。

image.png

30 秒ほどかかってこうなりました。
image.png

Stateless で FizzBuzz

同じソースコードを今度は Stateless にしてみます。ソースコード上からも以下ご覧いただけます。
image.png

今度は 6 秒少々です。やはり早いのですねー!
image.png

もう少し処理させよう

入れ子式に、子ワークフローへ 100 回 Http Request を送ってみます。

Stateful で Request

image.png

JSON
{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Compose_1": {
                "inputs": "@variables('Val')",
                "runAfter": {
                    "For_each_1": [
                        "SUCCEEDED"
                    ]
                },
                "type": "Compose"
            },
            "For_each_1": {
                "actions": {
                    "Append_to_string_variable": {
                        "inputs": {
                            "name": "Val",
                            "value": "@{items('For_each_1')} / @{if(equals(mod(items('For_each_1'), 3), 0), 'Fizz', ' ')}@{if(equals(mod(items('For_each_1'), 5), 0), 'Buzz', ' ')}"
                        },
                        "runAfter": {
                            "Invoke_a_workflow_in_this_workflow_app": [
                                "SUCCEEDED"
                            ]
                        },
                        "type": "AppendToStringVariable"
                    },
                    "Invoke_a_workflow_in_this_workflow_app": {
                        "inputs": {
                            "host": {
                                "workflow": {
                                    "id": "test"
                                }
                            }
                        },
                        "type": "Workflow"
                    }
                },
                "foreach": "@range(1,100)",
                "runAfter": {
                    "Initialize_variable": [
                        "SUCCEEDED"
                    ]
                },
                "runtimeConfiguration": {
                    "concurrency": {
                        "repetitions": 1
                    }
                },
                "type": "Foreach"
            },
            "Initialize_variable": {
                "inputs": {
                    "variables": [
                        {
                            "name": "Val",
                            "type": "string"
                        }
                    ]
                },
                "runAfter": {},
                "type": "InitializeVariable"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "triggers": {
            "When_a_HTTP_request_is_received": {
                "kind": "Http",
                "type": "Request"
            }
        }
    },
    "kind": "Stateful"
}

結果、30 秒ほど。
image.png

Stateless で Request

同じく Http Request を 100 回実行させてみます。

image.png

JSON
{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Compose_1": {
                "inputs": "@variables('Val')",
                "runAfter": {
                    "For_each_1": [
                        "SUCCEEDED"
                    ]
                },
                "type": "Compose"
            },
            "For_each_1": {
                "actions": {
                    "Append_to_string_variable": {
                        "inputs": {
                            "name": "Val",
                            "value": "@{items('For_each_1')} / @{if(equals(mod(items('For_each_1'), 3), 0), 'Fizz', ' ')}@{if(equals(mod(items('For_each_1'), 5), 0), 'Buzz', ' ')}"
                        },
                        "runAfter": {
                            "Invoke_a_workflow_in_this_workflow_app": [
                                "SUCCEEDED"
                            ]
                        },
                        "type": "AppendToStringVariable"
                    },
                    "Invoke_a_workflow_in_this_workflow_app": {
                        "inputs": {
                            "host": {
                                "workflow": {
                                    "id": "test"
                                }
                            }
                        },
                        "type": "Workflow"
                    }
                },
                "foreach": "@range(1,100)",
                "runAfter": {
                    "Initialize_variable": [
                        "SUCCEEDED"
                    ]
                },
                "runtimeConfiguration": {
                    "concurrency": {
                        "repetitions": 1
                    }
                },
                "type": "Foreach"
            },
            "Initialize_variable": {
                "inputs": {
                    "variables": [
                        {
                            "name": "Val",
                            "type": "string"
                        }
                    ]
                },
                "runAfter": {},
                "type": "InitializeVariable"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "triggers": {
            "When_a_HTTP_request_is_received": {
                "kind": "Http",
                "type": "Request"
            }
        }
    },
    "kind": "Stateless"
}

結果 10 秒そこそこ。なるほどなるほど。

image.png

実行履歴を確認するには「デバッグ モードを有効にする」を ON にする、あるいは以下、
「ステートレス ワークフローの実行履歴を有効にする」をご確認くださいませ。実用時はデバッグを無効化することでもう少し早くなりそうですね。

まとめ

ステートフル ワークフローとステートレス ワークフローの違いのまとめ

image.png

今回はステートレス ワークフローに実際どういう特長があるのかを確かめる目的で動作確認してみましたが、ステートフル ワークフローも含めた Standard Logic Apps (シングルテナント) にはまだまだ実業務で使えるポイントが豊富に取り揃えられております。当 Microsoft Azure Techのカレンダー | Advent Calendar 2023 - Qiita の 25日にも Standard Logic Apps のパワフルな解説記事が予定されている模様です。どうかお楽しみに。

そして告知です! 私、来週 12/15 (金) に 同じく Logic Apps を話題にお話しさせていただけることになりました。

Azure Logic Apps で ERP こうできるんじゃないの

題して ぼくのかんがえたさいきょうの ERP 連携 w/Azure Logic Apps です。

image.png

趣味に全振りで「やってみた」、「やってみたい」を書くのは楽しいですね。以上ここまで読んでいただきありがとうございます。Microsoft Azure Techのカレンダー | Advent Calendar 2023 - Qiita を購読設定して、明日の記事もお楽しみに、良き週末をお過ごしくださいませ。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?