非同期タスクを使用すると、ビジネスステータスをリアルタイムで表示し、関数の実行を制御できます。アラート通知の送信や自動再試行の実行など、異常な状況をより適切に処理できます。このトピックでは、Serverless Devs と Function Compute コンソールを使用して非同期タスクを作成する方法について説明します。
背景情報
Function as a Service (FaaS) は、もともとステートレス、短期、軽量のコンピューティングをサポートしていました。例としては、API バックエンド、イメージ処理、データストリーム処理などがあります。FaaS 関数は、同期または非同期で呼び出すことができます。同期呼び出しは、関数をすぐに実行します。非同期呼び出しは、すぐに HTTP 202 状態コードを返し、呼び出しメッセージをキューに入れてバックエンドサービスで処理します。
シナリオ
ビジネスの成長に伴い、オンラインライブストリーミングなどのシナリオのユーザーは FaaS に移行しています。これらのシナリオでは、多くの場合、長い実行時間、高遅延感度、高可用性の要件が伴います。開発者は、リアルタイムのステータス情報と関数の実行に対する制御を必要とします。標準の同期呼び出しと非同期呼び出しは、これらの要件には適していません。非同期呼び出しは、遅延の影響を受けやすいアプリケーション向けに設計されておらず、同期呼び出しは、クライアントリソースを消費する不安定な長時間接続を使用します。ただし、非同期呼び出しは、大量のトラフィックバーストがあるオフラインサービスでのピーク負荷のシフトに適しています。これにより、ダウンストリームシステムへの影響を平滑化できます。このため、Function Compute は、非同期呼び出しを非同期タスクで拡張します。非同期タスクは、次のビジネスシナリオに適しています。
監視可能な実行
実行ステータスをリアルタイムで表示します。たとえば、メッセージがデキューされたか、関数がトリガーされたか、結果がコールバック先に送信されたかなどを表示できます。
ワークロードには、次の明確なタスクプロパティがあります。
特定の実行のトリガーイベントとリアルタイムログを表示できます。
実行名、時間、またはステータスで履歴をフィルターおよびクエリできます。
操作可能な実行
サービスには次のタスクプロパティがあります。
関数が長時間実行されている場合は、手動で停止します。
失敗した、または成功した以前の実行を再実行します。
詳細については、「非同期タスク」をご参照ください。
準備
Simple Message Queue (MNS) キューを作成します。詳細については、「キューの作成」をご参照ください。
RAM ロールを作成し、次のアクセスポリシーを付与します。または、[AliyunFCDefaultRolePolicy] ポリシーを直接使用することもできます。詳細については、「RAM ロールの作成」をご参照ください。
{ "Version": "1", "Statement": [ { "Action": [ "fc:InvokeFunction", "mns:SendMessage", "mns:PublishMessage", "log:*" ], "Resource": "*", "Effect": "Allow" } ] }
手順
非同期タスクでは、次の操作を実行できます。
関数が非同期実行を開始した後、Function Compute コンソールで、または SDK か API を使用して実行を表示できます。
関数の実行が失敗したか、手動で停止された場合、Function Compute はメッセージを Simple Message Queue (formerly MNS) キューにプッシュします。このキューはデッドレターキューとして機能し、失敗した実行を通知して処理できるようにします。
次のコマンドを実行してプロジェクトをクローンします。
git clone https://github.com/awesome-fc/Stateful-Async-Invocation.git次のコマンドを実行してプロジェクトディレクトリに移動します。
cd Stateful-Async-Invocations.yaml ファイルを変更します。
次のコードは、s.yaml ファイルの完全な例です。
{accountid}を Alibaba Cloud アカウント ID に、{myqueue}を非同期呼び出しの宛先 Simple Message Queue (formerly MNS) キューの名前に置き換えます。edition: 3.0.0 name: stateful-async-inovcation-demo access: default resources: fc-job: component: fc3 props: region: cn-hangzhou description: this is test handler: index.handler memorySize: 128 runtime: python3 instanceConcurrency: 1 timeout: 60 internetAccess: true role: acs:ram::{accountid}:role/aliyunfcdefaultrole functionName: my-fc-job code: ./code asyncInvokeConfig: maxAsyncEventAgeInSeconds: 172800 maxAsyncRetryAttempts: 1 asyncTask: true qualifier: LATEST destinationConfig: onSuccess: destination: acs:mns:cn-hangzhou:{accountid}:/queues/{myqueue}/messages onFailure: destination: acs:mns:cn-hangzhou:{accountid}:/queues/{myqueue}/messages宛先ディレクトリで、次のコマンドを実行して関数をデプロイします。
sudo s deployデプロイメントが成功したら、Function Compute コンソールにログインして、関数が作成され、その非同期タスク機能が有効になっていることを確認します。
結果の検証
Serverless Devs を使用して、前のステップでデプロイした関数を非同期に呼び出します。次のコードは一例です。
sudo s invoke --invocation-type Async -e '{"failure":true}'Function Compute コンソールで非同期呼び出しを表示および管理することもできます。詳細については、「タスク管理」をご参照ください。
説明関数のログなどの詳細を表示するには、関数に Simple Log Service を設定する必要があります。詳細については、「ログの設定」をご参照ください。
関数の呼び出しが完了した後、コールバック先が設定されている場合は、宛先をチェックしてプッシュレコードを表示します。
この例では、設定されたコールバック先は Simple Message Queue (formerly MNS) キューです。次の例に示すように、Simple Message Queue (旧称:MNS) コンソールでプッシュされたメッセージを表示できます。
{ "timestamp": 1728465119433, "requestContext": { "requestId": "1-670648a1-15197d0b-d07710222f9d", "functionArn": "acs:fc:cn-hangzhou:1034354682****:functions/my-fc-job", "condition": "InvocationError", "approximateInvokeCount": 2 }, "requestPayload": "{\"failure\":true}", "responseContext": { "statusCode": 200, "functionError": "InvocationError" }, "responsePayload": "{\"errorMessage\":\"Function timed out after 60 seconds (maxMemoryUsage: 8MB)\"}" }説明非同期呼び出しが失敗したか、手動で停止された場合、呼び出しに関する詳細なエラーメッセージが Simple Message Queue (formerly MNS) に送信されます。