関数の非同期呼び出しの各フェーズのステータスを追跡して保存する場合は、タスクモードを有効にして非同期リクエストを処理できます。 このトピックでは、非同期タスクの背景情報、制限、および一般的な機能について説明します。
背景
非同期タスク機能を有効にすると、次の機能を取得できます。
Enqueued、Succeeded、およびFailedなどの状態遷移情報は、関数呼び出しごとに記録されます。
機能要求のライフサイクル管理能力が提供される。 実行中の非同期タスクを終了できます。
非同期タスク機能を有効にすると、ステータス情報を保存する必要があるため、関数の呼び出しと実行のレイテンシが増加します。 レイテンシが増加しても追加料金は発生しません。 Function Computeの課金の詳細については、「課金の概要」をご参照ください。
制限事項
シナリオ
非同期タスク機能はより多くの機能を提供しますが、より多くのシステムオーバーヘッドが発生します。 次のシナリオでは、非同期タスク機能を無効にすることを推奨します。
ビジネスアプリケーションは、リクエスト処理リンクのレイテンシに敏感であり、平均レイテンシが100ミリ秒未満である必要があります。
1秒あたり少なくとも数千の非同期呼び出しを開始する必要があります。
サポートされるリージョン
非同期タスク機能は、中国 (杭州) 、中国 (上海) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (深セン) 、中国 (成都) 、中国 (香港) 、シンガポール、英国 (ロンドン) 、米国 (シリコンバレー) 、米国 (バージニア) 、ドイツ (フランクフルト) 、オーストラリア (シドニー) サービス終了、マレーシア (クアラルンプール) 、インドネシア (ジャカルタ) 、タイ (バンコク) 、日本 (東京) 、韓国 (ソウル) 。
有効期間
タスクのステータス情報は、過去7日以内にのみ照会できます。
非同期タスクとKubernetesジョブの比較
Function ComputeジョブとKubernetesジョブの両方の非同期タスク機能を使用して、非同期タスクを実行できます。 Function Computeは、非同期タスク機能に基づいて、より効率的で簡単に制御および監視できる、すぐに使用できる非同期タスク実行プラットフォームを提供します。 次の表は、2つの方法を比較しています。
項目 | Function Computeの非同期タスク | Kubernetesジョブ |
シナリオ | 数十ミリ秒続くリアルタイムタスクと数十時間続くオフラインタスク。 | ワークロードが固定され、タスクの送信速度と適時性に関する要件が低いオフラインタスク。 |
可観測性 | サポートされています。 ログ、キューに入れられたタスクの数などのメトリック、およびタスクリンク期間やタスクステータスのクエリなどの可観測性機能が提供されます。 | オブザーバビリティ機能を実装するには、オープンソースソフトウェアを統合する必要があります。 |
タスクインスタンスの自動スケーリング | サポートされています。 キューに入れられたタスクの数とインスタンスのリソース使用量に基づく自動スケーリングを実行できます。 | タスクキューを使用して、インスタンスのスケーリングと負荷分散を手動で実装する必要がありますが、これはより複雑です。 |
タスクインスタンスのスケーリング速度 | ミリ秒単位。 | 数分で |
タスクインスタンスのリソース使用率 | インスタンスタイプのみを選択する必要があります。 インスタンスは自動的にスケーリングされます。 実際のタスク処理期間に基づいて課金されます。 リソース使用率が高い。 | ジョブの送信時に、インスタンスの仕様と数を決定する必要があります。 インスタンスの自動スケーリングと負荷分散を実装することは困難です。 リソース使用率は低いです。 |
タスク送信速度 | 1人のユーザーが1秒あたり数万のタスクを送信できます。 | 1秒間に最大数百のジョブをクラスターで開始できます。 |
スケジュールまたは遅延タスクの送信 | サポートされています。 | スケジュールされたタスクの送信がサポートされます。 遅延タスクの送信はサポートされていません。 |
タスク重複排除 | サポートされています。 | サポートされていません。 |
タスクの終了 | サポートされています。 | 特定の条件下でサポートされます。 タスクインスタンスを停止することで、タスクを終了できます。 |
タスク調整 | サポートされています。 スロットリングは、ユーザレベルまたはタスク処理機能レベルなど、異なる粒度で実行することができる。 | サポートされていません。 |
タスクの自動結果コールバック | サポートされています。 | サポートされていません。 |
開発とO&Mのコスト | タスク処理ロジックのみを実装する必要があります。 | Kubernetesクラスターを維持する必要があります。 |
タスク管理
非同期タスクの状態
Function Computeは、タスクの呼び出しごとに、タスクの状態変更に関する情報を記録し、タスクの状態をリアルタイムで照会できます。 Function Compute SDKまたはFunction Computeコンソールを使用して、タスクの状態を表示できます。 タスクは、次のいずれかの状態になります。
状態 | 説明 |
エンキュー済み | 非同期呼び出しはエンキューされ、実行される。 |
処理済み | 非同期呼び出しはデキューされ、トリガーされるのを待ちます。 |
実行中 | 呼び出しが実行され、インスタンスがタスクコードの実行を開始しました。 |
成功した | 呼び出しは成功します。 |
失敗しました | 呼び出しは失敗します。 |
停止しました | 呼び出しを停止しようとしましたが、タスクは正常に終了しました。 |
停止中 | タスクを停止しようとしましたが、タスクは終了中です。 |
期限切れ | 非同期呼び出しの有効期間が設定されていること。 呼び出しが期限切れになり、破棄されました。 |
無効 | 呼び出しは無効であり、特定の理由によりトリガーされません。 例えば、関数は削除される。 |
再試行 | 実行エラーが発生した後、呼び出しが再試行中です。 システムがタスクを再試行する準備ができたら、タスクの状態は実行中に変わります。 |
GetAsyncTask操作を呼び出して、非同期タスクの詳細を照会できます。 ListAsyncTasksを呼び出して、指定した状態のタスクをフィルタリングすることもできます。
タスクの管理
Function Computeコンソールでのタスクの管理
関数を作成するときに非同期タスク機能を有効にする
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、[関数の作成] をクリックします。
[関数の作成] ページで、[タスク関数] を選択し、ビジネス要件に基づいてパラメーターを設定し、[作成] をクリックします。
パラメーターの詳細については、「タスク関数の作成」をご参照ください。
関数が作成されると、[設定] ページの [非同期モードの設定] タブでタスクモードがデフォルトで有効になります。
既存の関数の非同期タスクモードの有効化
続行する前に、関数が作成されていることを確認してください。 関数の作成方法の詳細については、「関数の作成」をご参照ください。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
機能の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションツリーで、[非同期モードの設定] をクリックします。
[非同期モード設定] セクションで、[変更] をクリックします。 [非同期モード設定] パネルで、[タスクモード] を [有効化] に設定し、[デプロイ] をクリックします。
タスクの開始または停止
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[タスク] タブをクリックし、[タスクの送信] をクリックします。 表示されるダイアログボックスで、タスクIDの生成方法を選択してタスクの実行時間を指定し、[OK] をクリックします。
[タスクの送信] の右側にあるアイコンをクリックし、ドロップダウンリストから [テストパラメーターの設定] を選択することもできます。 イベント関数はeventを使用し、HTTP関数はHTTPパラメーターを使用して入力パラメーターを関数に渡し、タスクの送信をシミュレートします。
以下のタスクリストでは、タスクのステータス、タスクの詳細、リクエストID、インスタンスIDを表示し、インスタンスに接続できます。
タスクを管理するためのAPI操作の呼び出し
タスクモードの設定
PutAsyncInvokeConfigを呼び出して、非同期呼び出しの非同期タスクモードを有効にします。 次のコードスニペットに示すように、asyncTaskを設定します。 次に、関数のすべての非同期呼び出しに対して非同期タスクモードが有効になります。
{
"asyncTask": true
}
非同期タスクモードを設定しても、同期モードで関数を呼び出すことができます。 非同期タスクモードは、非同期呼び出しに対してのみ有効です。
非同期モードで関数をトリガーする
InvokeFunction操作を呼び出して、非同期呼び出しをトリガーし、関数のタスクモードをアクティブにできます。 x-fc-invocation-type requestパラメーターをAsyncに設定します。 HTTPリクエストヘッダーx-fc-async-task-idを追加して、この呼び出しのタスクIDを設定できます。 詳細については、「タスク重複排除」をご参照ください。
タスクの表示
タスクを送信した後、GetAsyncTask操作を呼び出して、タスクの実行ステータスと実行レコードを照会できます。
ListAsyncTasks操作を呼び出して、キーワードまたは条件に基づいて非同期タスクのリストを照会できます。
タスクの停止
タスクを送信した後、ビジネス要件に基づいてタスクを停止できます。 StopAsyncTaskを呼び出して、非同期タスクを停止できます。 タスクを停止するときは、タスクを送信するときに設定するタスクIDを指定する必要があります。 ListAsyncTasksを呼び出して、実行中のタスクのIDを照会することもできます。
イベントを使用したタスクのトリガー
非同期呼び出しをサポートするトリガーを作成して、非同期タスクをトリガーできます。 非同期呼び出しをサポートするトリガーの一覧を次に示します。
EventBridgeベースのトリガー:
重要HTTPトリガーとEventBridgeベースのトリガーが非同期モードでトリガーされていることを確認します。
タスク重複排除
タスクの繰り返し実行を回避するために、Function Computeでは、送信されたタスクごとにグローバルに一意のIDを設定できます。 非同期送信操作などの非同期操作がタイムアウトした場合、同じIDを持つタスクを送信して再試行できます。 詳細については、「再試行ポリシー」をご参照ください。
Function Computeでは、グローバルに一意なタスクIDであるTaskIDを設定できます。 タスクを送信するたびにタスクIDを指定することを推奨します。 タイムアウトエラーなどのエラーが発生した場合、タスクIDを使用してタスクを再試行できます。 Function Computeは、送信したタスクを検証します。 同じIDのタスクがシステムに入ると、要求は拒否され、エラー409
が返されます。
Function ComputeはRequestIDも提供します。 RequestIDを設定し、TaskIDを設定しない場合、システムは自動的にTaskIDをRequestIDの値に設定します。 非同期タスクを使用する場合は、TaskIDを指定し、RequestIDを指定しないことを推奨します。
タスクIDの設定
Function Computeコンソールを使用するか、Serverless Devsを使用するか、API操作を呼び出してタスクを実行することができます。 TaskIDを設定する必要がある場合は、関数をトリガーするときにx-fc-async-task-idパラメーターを設定します。
TaskIDを設定するためのサンプルコードの詳細については、 「サンプルコード」をご参照ください。
タスクモニタリング
Function Computeが提供するタスクモニタリングメトリックを使用して、非同期タスクのステータスをリアルタイムで監視し、エラーやタイムアウトなどの例外をタイムリーに検出できます。
前提条件
関数が作成されます。 詳細については、「関数の作成」をご参照ください。
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、目的の関数をクリックします。
関数の詳細ページで、[モニタリング] タブをクリックして、非同期呼び出しと非同期タスクのインスタンスレベルのリソース使用量に関連するメトリックを表示します。 メトリクスの詳細については、「モニタリングメトリクス」をご参照ください。
[関数メトリック] タブをクリックして、非同期呼び出しに関連するメトリックを表示します。 次の図に例を示します。
[Instance Metrics] タブをクリックして、非同期タスクのインスタンスレベルのリソース使用状況を表示します。 次の図に例を示します。
説明インスタンスレベルのメトリックを有効にする前に、ログ機能を有効にする必要があります。 詳細については、「ロギング機能の設定」をご参照ください。
メトリックベースのアラートルールを設定します。
メモリ使用量やvCPU使用量などのメトリックを監視する場合は、メトリックの右上隅にあるをクリックして、[メトリックベースのアラートルールの作成] パネルに移動します。 ビジネス要件に基づいてアラート条件としきい値を設定し、[OK] をクリックします。
次の図は、関数の非同期呼び出しのバックログが5以上の場合に、DingTalk、email、phone、およびwebhookによって24時間体制で連絡先に通知される警告ルールの設定例を示しています。
仕事のオーケストレーション
Function ComputeとCloudFlowを統合して、大規模で複雑なシナリオのタスクプロセスに関数の非同期呼び出しを適用できます。 シーケンス、選択、並列など、CloudFlowの制御ロジックに基づいて、Function Compute非同期タスクを調整できます。 CloudFlowは、指定されたステップに従ってタスクの実行を信頼できる方法で調整し、各タスクの状態遷移を追跡し、必要に応じて定義された再試行ロジックを実行して、スムーズで正常なタスク完了を保証します。 詳細については、「CloudFlowとFunction Computeの統合」をご参照ください。
前提条件
非同期タスクが作成されます。 詳細については、「タスク管理」をご参照ください。
CloudFlowへのアクセス許可がFunction Computeに付与されます。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。
手順
CloudFlowコンソールにログインします。 上部のナビゲーションバーで、リージョンを選択します。
左側のナビゲーションウィンドウで、[ワークフロー] をクリックします。 [ワークフロー] ページで、[ワークフローの作成] をクリックします。
では、ワークフローの作成ダイアログボックスで、ワークフローを作成する方法を選択し、ワークフローのモードを選択します。
CloudFlowでは、標準モードまたはエクスプレスモードでワークフローを作成できます。 2つのモードの詳細については、「標準モードとエクスプレスモード」をご参照ください。 詳細については、「空白のキャンバスに基づくワークフローの作成」をご参照ください。
作成したフローを編集します。
フローを編集します。
CloudFlow StudioまたはYAMLを使用してフローを編集できます。 この例では、YAMLが使用されています。
フローの詳細ページの右上隅で、[YAML] をクリックします。 左側のコードエディターで、フローで使用するコードを入力し、[保存] をクリックします。
サンプルコード:
Type: StateMachine Name: MyFlow SpecVersion: v1 StartAt: InvokeFunction States: - Type: Task Name: InvokeFunction Action: FC:InvokeFunction TaskMode: RequestComplete Parameters: invocationType: Async resourceArn: acs:fc:us-west-1:103435468****:functions/func-i1****/LATEST End: true
フローロールを設定します。
フローの詳細ページの右上隅で、[ワークフローの設定] をクリックし、[ロールの設定] セクションの [実行ロール] ドロップダウンリストからロールを選択し、[保存] をクリックします。
説明フローに設定されたロールにAliyunFCInvocationAccessポリシーがアタッチされていることを確認します。
フローの詳細ページで、右上隅の [実行] をクリックしてフローをトリガーし、フローが期待どおりに機能するかどうかを確認します。