サーバーレスワークフロー のタスクステップでは、ワークフローは関数計算の関数を非同期的に呼び出すことができます。非同期呼び出しは、長期タスクや手動監査など、いくつかのシナリオに最適です。非同期関数呼び出しは、スロットリングエラーを防ぎ、エラー処理手順と再試行ロジックを簡素化できます。このトピックでは、非同期関数呼び出しのシナリオと統合パターンについて説明します。また、サーバーレスワークフロー と非同期関数呼び出しを統合する方法の例も示します。
前提条件
以下の操作を実行します。
オプション: 非同期呼び出しが有効になっています。詳細については、概要をご参照ください。
関数のステートフル非同期呼び出しを有効にすると、タスクの実行中に関数インスタンスを停止できます。これにより、フローをより細かい粒度で表示できます。
関数計算には、サーバーレスワークフロー にアクセスするための権限が付与されています。これにより、非同期関数の実行が完了した後、サーバーレスワークフロー をコールバックして後続のステップを実行できます。次のスニペットは、権限ポリシーを設定する方法を示しています。
{ "Statement": [ { "Effect": "Allow", "Action": [ "fnf:ReportTaskSucceeded", // タスクの成功を報告 "fnf:ReportTaskFailed" // タスクの失敗を報告 ], "Resource": [ "*" ] } ], "Version": "1" }承認の詳細については、他のAlibaba Cloudサービスにアクセスするための権限を関数計算に付与するをご参照ください。
背景情報
デフォルトでは、サーバーレスワークフロー が関数計算タスクを調整してタスクフローを実装する場合、サーバーレスワークフロー は同期パターンを使用します。同期パターンでは、ワークフローが前の関数の実行結果を受信するまで、サーバーレスワークフローは次のステップに進みません。次のスニペットは、同期パターンを使用するフローを示しています。
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:{region}:{account}:services/{serviceName}.{qualifier}/functions/{functionName}関数呼び出しに同期パターンを使用すると、次の問題が発生する可能性があります。
関数計算の関数の呼び出しに関するリソース制限により、スロットリングエラーが発生する可能性があります。デフォルトでは、関数計算のAlibaba Cloudアカウントの単一リージョンで最大 300 の従量課金インスタンスが許可されます。
サーバーレスワークフロー を使用して関数を呼び出す場合、呼び出しは他のサービスによって開始された関数呼び出しと同じクォータを共有します。これにより、スロットリングエラーが発生する可能性があります。この場合、サーバーレスワークフロー フローで複雑な再試行ポリシーを定義する必要があります。ただし、これによりフローが正常に実行されることは保証されません。
タスクの実行に長い時間がかかる場合、サーバーレスワークフロー と関数計算の間に永続的な接続を確立する必要があります。不安定なネットワーク状態により、予期しないエラーが発生する可能性があります。
サーバーレスワークフロー では、非同期関数呼び出し機能とさまざまな統合パターンを組み合わせて、前述の問題を解決できます。同時に、この組み合わせは次の要件を満たすことができます。
シナリオによっては、システムは現在のステップの完了を待たずに後続のステップを実行する必要があります。
フローの実行中に予期しないエラーが発生した場合、システムは現在のステップをスキップして次のステップに進む必要があります。
シナリオ
サーバーレスワークフローは、シナリオに応じて、リクエストレスポンスパターン(requestResponse)、同期パターン(sync)、または待機コールバックパターン(waitForCallback)を使用して、関数計算の関数を非同期的に呼び出します。
統合パターン | パターンパラメータの値 | シナリオ |
リクエストレスポンスパターン(デフォルトパターン) |
サンプルフロー: | タスクは長時間実行され、タスクの実行結果は重要ではありません。 |
同期パターン |
サンプルフロー: | タスクは長時間実行され、スロットルされる可能性があります。 |
待機コールバックパターン |
サンプルフロー: | フローが特定のステップに到達すると、現在のステップの実行が完了したかどうかに関係なく、フローは後続のステップに進む必要があります。サンプルシナリオは手動監査です。 |
サービスパラメータ
次の例では、サーバーレスワークフロー はタスクノードとして関数計算を使用し、resourceArn を使用してデスティネーションサービスとして関数計算を指定し、serviceParams を使用して関数計算の関数を呼び出すために使用されるパラメータを指定します。serviceParams は次のパラメータをサポートしています。
InvocationType: 関数の呼び出しタイプ。有効な値はSyncとAsyncです。 Sync は同期呼び出しを示します。 Async は非同期呼び出しを示します。オプション:
StatefulAsyncInvocationID: ステートフル非同期呼び出しの ID。このパラメータを使用して、関数計算コンソールでデスティネーションタスクの名前を検索できます。説明InvocationTypeをAsyncに設定し、StatefulAsyncInvocationID の値を指定すると、サーバーレスワークフロー の関数呼び出しパターンはステートフルで非同期呼び出しになります。 StatefulAsyncInvocationID パラメータの値は、すべての関数で一意である必要があります。
非同期関数呼び出しの統合パターン
リクエストレスポンスパターン
フローが指定されたステップに到達すると、サーバーレスワークフローは指定された関数を非同期的に呼び出し、関数を実行します。次に、コールバックまたは前のステップの完了を待たずに、フローは次のステップに進みます。
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:{region}:{account}:services/{serviceName}.{qualifier}/functions/{functionName}
pattern: requestResponse // 同期パターンでの非同期呼び出し
serviceParams:
InvocationType: Async前の例は、フローが mytask ステップに到達すると、関数がトリガーされて実行されることを示しています。関数がトリガーされた後、mytask ステップの実行が完了していない可能性がある場合でも、フローは次のステップに進みます。
同期パターン
フローが指定されたステップに到達すると、サーバーレスワークフローは指定された関数を非同期的に呼び出し、関数を実行します。次に、サーバーレスワークフロー フローが関数の実行が完了したことを通知されるまで、フローは中断され、次のステップに進みません。
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:{region}:{account}:services/{serviceName}.{qualifier}/functions/{functionName}
pattern: sync // 同期パターンでの非同期呼び出し
serviceParams:
InvocationType: Async前の例は、フローが mytask ステップに到達すると、関数がトリガーされて実行されることを示しています。次に、フローが関数の実行が完了したことを通知されるまで、フローは中断され、次のステップに進みません。
同期統合パターンの使用は、操作の点で同期関数呼び出し機能の使用と同じです。関数呼び出し方法のみが異なります。
待機コールバックパターン
フローが指定されたステップに到達すると、サーバーレスワークフローは関数を非同期的に呼び出し、関数を実行し、タスクトークンを渡します。次に、フローは中断されます。関数の実行が完了したかどうかに関係なく、タスクトークンを使用して関数の実行結果をフローに手動で通知するまで、フローは次のステップに進みません。
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:{region}:{account}:services/{serviceName}.{qualifier}/functions/{functionName}
pattern: waitForCallback // 同期パターンでの非同期呼び出し
serviceParams:
InvocationType: Async前の例は、フローが mytask ステップに到達すると、関数がトリガーされて実行されることを示しています。関数がトリガーされた後、フローは ReportTaskSucceed または ReportTaskFailed API 操作の呼び出しで実装されるコールバックを待機するために中断されます。フローがコールバックリクエストを受信して処理するまで、フローは次のステップに進みません。コールバックリクエストはユーザーによって開始されます。関数の実行が完了したとき、または完了していないときに、コールバックリクエストを開始できます。
例: 非同期関数呼び出し
サーバーレスワークフロー は、非同期関数呼び出し機能とステートフル非同期呼び出し機能を組み合わせて、ジョブタイプのシナリオをサポートします。ステートフル非同期呼び出し機能を有効にし、非同期呼び出しパターンを使用すると、関数の実行ステータスを表示し、関数の呼び出し時および呼び出し後に関数の実行を停止できます。これにより、フローが監視可能になり、操作が容易になります。次のスニペットは、サーバーレスワークフロー のフロー定義言語(FDL)を示しています。
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:::services/{serviceName}.{qualifier}/functions/{functionName}
pattern: sync // 同期パターンでの非同期呼び出し
inputMappings:
- target: id
source: $context.execution.name
serviceParams:
InvocationType: Async
StatefulAsyncInvocationID: $.id