関数に時間のかかる、リソースを大量に消費する、またはエラーが発生しやすいロジックが含まれている場合、非同期呼び出しは特に有益であり、アプリケーションがトラフィックスパイクをより効率的かつ確実に処理できるようになります。関数が非同期で呼び出される場合、その応答を待つ必要はありません。リクエストは Function Compute の内部キューに永続的に保存され、バックグラウンドで確実に処理されます。このトピックでは、非同期呼び出しのシナリオと主な特徴について説明します。
ユースケース
以下は、非同期呼び出しの一般的なユースケースです。
オーディオおよびビデオ処理
Function Compute は、エンコーディング、デコーディング、トランスコーディングなどのタスクがしばしば時間のかかるオーディオおよびビデオファイルを効率的に処理できます。これらの操作を非同期でトリガーすることにより、処理はバックエンドで行われ、フロントエンドは遅延なく継続できます。これにより、最終的にユーザーエクスペリエンスが向上します。さらに、非同期呼び出しにより、複数の関数を同時に実行できるため、全体的な処理時間が短縮されます。たとえば、大規模なプロジェクトを並列処理のためにいくつかのサブタスクに分割したり、1 つのビデオを同時にさまざまなフォーマットに変換したりできます。
データ ETL 処理
抽出・変換・書き出し (ETL) 操作中、データベースクエリ、ファイル I/O、データクレンジングなどのタスクは、多くの場合独立しており、並行して実行できます。非同期呼び出しにより、これらのプロセスを同時に実行できるため、処理時間が大幅に短縮され、システムパフォーマンスが向上します。大規模なデータ変換など、より複雑でリソースを大量に消費するタスクの場合、非同期呼び出しにより、フロントエンドをブロックすることなくバックエンド処理が保証され、よりスムーズなユーザーエクスペリエンスが実現します。
Web アプリケーション開発
Function Compute は、他のクラウドサービスとシームレスに統合して、堅牢な Web アプリケーションを構築します。非同期呼び出しは、フォームの送信、クエリ、大規模なデータの読み込みなど、長時間のバックエンド操作によって引き起こされるページのフリーズを防ぐのに役立ちます。これにより、ユーザーは中断することなくアプリケーションの他のコンポーネントと対話し続けることができます。多くのユーザーが同時にアプリケーションにアクセスする場合など、同時実行性が高いシナリオでは、非同期呼び出しは負荷を分散し、バックエンドサービスを過負荷から保護するのに役立ちます。
遅延呼び出し
特定のシナリオでは、非同期呼び出しリクエストを送信した後に Function Compute が関数の実行を延期する必要がある場合があります。これを実現するには、Function Compute API または SDK を使用して遅延呼び出しを設定します。
リクエストコードに HTTP リクエストヘッダー x-fc-async-delay を含めるだけです。このパラメーターの有効値は (0, 3600) 秒です。Function Compute は、指定された遅延期間が経過した後に、関数を呼び出します。
リトライポリシー
エラー処理とリトライメカニズムは、非同期呼び出しでサポートされています。タスクが失敗した場合、プロセス全体に影響を与えることなくタスクを再スケジュールできます。Function Compute は、呼び出しが失敗した場合、非同期呼び出しを自動的にリトライします。
リトライメカニズム
次の表に、一般的なエラーのデフォルトのリトライメカニズムを示します。
エラータイプ | サーバーの動作 | 課金対象 | 解決策 |
Function Compute の | デフォルトでは、Function Compute は関数を最大 3 回リトライします。ビジネス要件に基づいてリトライ回数を変更できます。 | 呼び出し回数に基づいて課金されます。詳細については、「課金の概要」をご参照ください。 | コードを確認してください。 |
実行同時実行数の上限を超えました | Function Compute は、バイナリ指数バックオフモードで最大 5 時間、関数の実行をリトライします。関数の実行が失敗した場合、0.5 秒後にリトライが開始されます。後続のリトライ間隔は、1 秒、2 秒、4 秒、8 秒など、バイナリ指数バックオフモードで計算されます。リトライは最大 5 時間続きます。 | いいえ | デフォルトでは、各 Alibaba Cloud アカウントは各リージョンで最大 100 個のインスタンスを実行できます。[Quota Center] コンソールの [General Quotas] ページに表示される実際のクォータが優先されます。[Quota Center] コンソールでクォータを増やすことができます。 |
内部エラー | いいえ | テクニカルサポートについては、DingTalk グループ (ID: 64970014484) にご参加ください。 | |
Function Compute リソースが不足しています | いいえ |
リトライポリシーの設定
Function Compute で、メッセージの最大リトライ回数と最大存続時間 (TTL) を指定できます。
[Function Compute コンソール] にログインします。左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。[関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[タスク] タブに移動します。[タスクモード] セクションで、[変更] をクリックします。表示される [タスクモード] パネルで次のパラメーターを調整し、[デプロイ] をクリックして変更を保存します。
パラメーター | 説明 |
タスクモード | 非同期タスクモードを有効にするかどうかを指定します。詳細については、「非同期タスク」をご参照ください。 |
最大リトライ回数 | 非同期呼び出しにおけるメッセージの最大リトライ回数。有効値: [0,8]。 デフォルトでは、Function Compute は、非同期でトリガーできなかったメッセージを 3 回リトライします。ビジネス要件に基づいて、非同期呼び出しのリトライ回数を増減できます。 |
最大メッセージ存続期間 | 非同期呼び出しにおけるメッセージの最大存続期間。有効値: [1,604800]。デフォルト値: 86400。単位: 秒。 この期間は、非同期呼び出しがトリガーされた時間から計算されます。最大メッセージ存続期間が経過すると、メッセージは破棄されます。破棄されたメッセージは、CloudMonitor の Asynchronous Invocation Trigger Events メトリックによって追跡されます。詳細については、「モニタリングメトリック」をご参照ください。 |
結果コールバック
非同期呼び出しリクエストを受信した後、Function Compute はリクエストを永続化し、リクエストが完了するのを待たずにすぐに応答を返します。指定された最大回数リトライされた後に実行に失敗したリクエストを保持したい場合、または非同期呼び出しの結果をダウンストリームアプリケーションに通知したい場合は、結果コールバックを設定できます。非同期呼び出しの宛先サービスを設定すると、Function Compute は実行結果に基づいて対応するサービスへのコールバックを自動的にトリガーします。
仕組み
次の図は、結果コールバックのプロセスを示しています。
シナリオ
破棄されたイベントを後で使用するために保存する
リトライポリシーに基づいてシステムがリクエストをリトライした後に非同期リクエストの実行に失敗した場合、Function Compute はリクエストを破棄します。失敗した呼び出しの宛先が設定されている場合、Function Compute は、失敗したリクエストのコンテキスト情報を ApsaraMQ for RocketMQ などの宛先サービスにプッシュして、後続の処理を行います。宛先サービスを別の関数に設定することもできます。Function Compute は、失敗したリクエストのコンテキスト情報をこの関数に自動的にプッシュして、カスタムエラー処理ロジックを実行します。
実行結果をダウンストリームサービスに通知する
成功した呼び出しの宛先を設定できます。リクエストが正常に実行された後、Function Compute はリクエストのコンテキスト情報をダウンストリームの宛先サービスにプッシュします。たとえば、Function Compute を使用して Object Storage Service (OSS) にアップロードされた ZIP ファイルを自動的に解凍する場合、解凍後に通知を受け取りたい場合は、解凍関数の結果コールバックを設定できます。
非同期呼び出しでサポートされる宛先サービス
関数の非同期呼び出しの宛先を設定した場合、Function Compute は、非同期呼び出しの結果が指定された条件を満たしたときに、リクエストのコンテキストとデータを指定されたサービスに送信します。関数、エイリアス、バージョンごとに異なる宛先サービスを設定できます。非同期呼び出しでは、次の宛先サービスがサポートされています。
Simple Message Queue (formerly MNS)
Function Compute
EventBridge
ApsaraMQ for RocketMQ
ApsaraMQ for RocketMQ を選択した場合、宛先サービスとして設定できるのは ApsaraMQ for RocketMQ 4.x インスタンスのみです。ApsaraMQ for RocketMQ 5.x インスタンスは宛先サービスとして設定できません。詳細については、「v4.x と v5.x の違いと互換性」をご参照ください。
非同期呼び出しの宛先サービスの負荷制限の詳細については、「関数のランタイムリソースの制限」をご参照ください。
非同期呼び出しの宛先サービスを設定する際は、次の項目に注意してください。
非同期呼び出しの宛先に送信されるイベントコンテンツ
次のサンプルコードは、非同期呼び出しの宛先が Simple Message Queue (formerly MNS)、Function Compute、または ApsaraMQ for RocketMQ である場合のイベントコンテンツの例を示しています。
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:{regionid}:{accountid}:functions/xxxx", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }表 1. パラメーターの説明
パラメーター
説明
timestamp
呼び出しのタイムスタンプ。
requestContext
リクエストのコンテキスト。
requestContext.requestId
非同期呼び出しのリクエスト ID。
requestContext.functionArn
非同期で呼び出される関数の Alibaba Cloud リソースネーム (ARN)。
requestContext.condition
呼び出しのエラーコード。
requestContext.approximateInvokeCount
非同期呼び出しの実行回数。1 より大きい値は、Function Compute が実行をリトライしたことを示します。
requestPayload
関数リクエストの元のペイロード。
responseContext
応答コンテキスト。
responseContext.statusCode
返されたシステム状態コード。200 以外の状態コードは、システムエラーが発生したことを示します。
responseContext.functionError
呼び出しのエラーメッセージ。
responsePayload
関数が実行された後に返される元のペイロード。
次のサンプルコードは、非同期呼び出しの宛先が EventBridge である場合のイベントコンテンツの例を示しています。詳細については、「概要」をご参照ください。
{ "datacontenttype": "application/json", "aliyunaccountid": "143xxxx", "data": { "requestContext": { "condition": "", "approximateInvokeCount": 1, "requestId": "0fcb7f0c-xxxx", "functionArn": "acs:fc:{regionid}:{accountid}:functions/xxxx" }, "requestPayload": "", "responsePayload": "", "responseContext": { "functionError": "", "statusCode": 200 }, "timestamp": 1660120276975 }, "subject": "acs:fc:{regionid}:{accountid}:functions/xxxx", "source": "acs:fc", "type": "fc:AsyncInvoke:succeeded", "aliyunpublishtime": "2021-01-03T09:44:31.233Asia/Shanghai", "specversion": "1.0", "aliyuneventbusname": "xxxxxxx", "id": "ecc4865xxxxxx", "time": "2021-01-03T01:44:31Z", "aliyunregionid": "cn-shanghai-vpc", "aliyunpublishaddr": "199.99.xxx.xxx" }ペイロードの制限
次の項目は、さまざまな宛先サービスのペイロードサイズの制限を示しています。
Simple Message Queue (formerly MNS): 64 KB
Function Compute: 関数のランタイムリソースの制限
EventBridge: 64 KB
ApsaraMQ for RocketMQ: 4 MB
ループ回避
非同期呼び出しの宛先を設定するときは、ループ呼び出しが発生しないようにしてください。たとえば、関数 A の成功した非同期呼び出しの宛先として関数 B を設定し、関数 B の成功した非同期呼び出しの宛先として関数 A を設定すると、ループが発生します。関数 A の非同期呼び出しと実行により、関数 A と関数 B が継続的にお互いを呼び出す無限ループが始まる可能性があります。
非同期呼び出しの宛先サービスの設定
[Function Compute コンソール] にログインします。左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。[関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[タスク] タブに移動します。[タスクの宛先] セクションで、[変更] をクリックします。表示される [タスクの宛先] パネルで次のパラメーターを調整し、[デプロイ] をクリックして変更を保存します。
成功した呼び出しの宛先を設定する:
[成功した呼び出しの宛先] パネルで、[成功時に他のサービスを呼び出す] を [有効] に設定し、[宛先サービス] パラメーターを設定します。次の表にパラメーターを示します。
パラメーター
説明
宛先サービス
Function Compute。[宛先サービス] ドロップダウンリストから Function Compute を選択した場合は、次のパラメーターを設定する必要があります。
[関数名]: 関数の名前。
[バージョンまたはエイリアス]: 関数のエイリアスまたはバージョン。
Simple Message Queue (formerly MNS)。[宛先サービス] ドロップダウンリストから Simple Message Queue (formerly MNS) を選択した場合は、次のパラメーターを設定する必要があります。
[宛先タイプ]: 成功した呼び出しの結果を受け取る宛先のタイプ。有効値:
キュー
キューベースのメッセージングモデルは、信頼性の高い同時メッセージ消費サービスを提供します。キュー内の各メッセージは、1 つのクライアントのみが消費できます。
Topic
トピックベースのメッセージングモデルは、1 つのパブリッシャークライアントから複数のサブスクライバークライアントにメッセージを送信するために使用されます。SMQ トピックは、複数のメソッドを使用してメッセージとしてプッシュできます。
[キュー]: Simple Message Queue (formerly MNS) キューの名前。このパラメーターは、[宛先タイプ] パラメーターを [キュー] に設定した場合に必要です。
[Topic]: Simple Message Queue (formerly MNS) トピックの名前。このパラメーターは、[宛先タイプ] パラメーターを [Topic] に設定した場合に必要です。
ApsaraMQ for RocketMQ。[宛先サービス] ドロップダウンリストから ApsaraMQ for RocketMQ を選択した場合は、次のパラメーターを設定する必要があります。
[インスタンス]: 宛先インスタンス。
[Topic]: 宛先トピック。
EventBridge。[宛先サービス] ドロップダウンリストから EventBridge を選択した場合は、[カスタムイベントバス] パラメーターを設定する必要があります。
失敗した呼び出しの宛先を設定する:
[失敗した呼び出しの宛先] パネルで、[失敗時に他のサービスを呼び出す] を [有効] に設定します。次に、[宛先サービス] パラメーターを設定します。
コールバック失敗の処理
関数に設定されたロールに宛先サービスに対する権限がない場合、または宛先サービスが利用できない場合、宛先サービスへのコールバックが失敗することがあります。このような失敗は、Function Compute が提供するメトリックとログに基づいて処理できます。次の表に、一般的なエラーとそれに対応するシステムアクションを示します。
HTTP ステータスコード | 説明 | システムアクション |
5xx | リクエストがスロットルされるか、コンテンツエラーが発生します。 | Function Compute は、指数バックオフモードでコールバックを自動的にリトライします。最初のリトライ間隔は 500 ミリ秒で、最大リトライ期間は 30 分です。 |
4xx | 必要な権限がない、リクエストパラメーターが正しくない、またはリクエストメッセージ本文が宛先サービスの制限を超えています。不正なリクエストパラメーターの例として、リクエストパラメーターで指定された宛先サービスのリソースが削除されている場合があります。 | システムはエラーを返し、エラーメッセージを記録します。 |
コールバックメトリック
コールバックが失敗すると、Function Compute は対応するメトリックを記録し、コンソールにメトリックを表示します。[Function Compute コンソール] にログインできます。左側のナビゲーションウィンドウで、 を選択します。[関数名] 列で、管理する関数の名前をクリックします。
メトリック | 説明 |
FunctionDestinationErrors | 関数の実行中に指定された宛先をトリガーできなかったリクエストの数。統計は 1 分ごとまたは 1 時間ごとに収集されます。 |
FunctionDestinationSucceed | 関数の実行中に指定された宛先を正常にトリガーしたリクエストの数。統計は 1 分ごとまたは 1 時間ごとに収集されます。 |
メトリックの詳細については、「モニタリングメトリック」をご参照ください。
よくある質問
関数の非同期呼び出しをトリガーする方法
Function Compute 関数を非同期で呼び出すには、次のいずれかの方法を使用できます。
[Function Compute コンソール] にログインし、目的の関数を見つけて、[テスト] タブで [非同期モードで関数を呼び出す] を選択します。

InvokeFunction 操作を呼び出し、
x-fc-invocation-typeパラメーターの値を Async に設定します。Serverless Devs を使用して非同期呼び出しを設定します。
invocation-typeパラメーターの値を Async に設定します。詳細については、「関数を呼び出す」をご参照ください。非同期呼び出しをサポートするトリガーを作成します。詳細については、「イベントを使用したタスクのトリガー」をご参照ください。
HTTP またはカスタムドメイン経由でトリガーします。この場合、
X-Fc-Invocation-TypeリクエストヘッダーをAsyncに設定します。例:curl -v -H "X-Fc-Invocation-Type: Async" https://example.cn-shenzhen.fcapp.run/$path
次のステップ
非同期リクエストの各フェーズのステータス情報を取得したい場合は、タスクモードを有効にできます。詳細については、「非同期タスク」をご参照ください。