関数に時間がかかる、リソースを大量に消費する、またはエラーが発生しやすいロジックが含まれている場合は、非同期呼び出しを使用して、プログラムがより効率的で信頼性の高い方法でトラフィックの急増に対応できるようにすることができます。 非同期モードで関数を呼び出す場合、関数が応答するのを待つ必要はありません。 リクエストは、確実に処理される前に、Function Computeの内部キューに永続的に格納されます。 このトピックでは、非同期呼び出しのシナリオと一般的な機能について説明します。
一般的なシナリオ
非同期呼び出しの一般的なシナリオを次に示します。
オーディオおよびビデオ処理
Function Computeを使用して、オーディオおよびビデオファイルを処理できます。 プロセス中、エンコード、デコード、トランスコードなどの時間のかかるタスクが含まれます。 これらのタスクを非同期モードでトリガーして、タスクをバックエンドで実行し、フロントエンドを待たずに続行できます。 ユーザーエクスペリエンスが向上します。 さらに、非同期モードで複数の関数を呼び出して、同時処理を実装し、タスクの処理時間を短縮できます。 たとえば、オーディオとビデオのプロジェクトを複数のタスクに分割し、プロジェクトが大きい場合はこれらのタスクを並行して処理できます。 ビデオを複数の形式に同時に変換することもできます。
データETL処理
抽出、変換、およびロード (ETL) プロセスでは、データベース照会、ファイルの読み取りおよび書き込み、およびデータクレンジングなどの複数の独立した操作が関与します。 非同期呼び出しを使用すると、これらの操作を並行して実行できるため、処理時間が短縮され、システムパフォーマンスが向上します。 大規模データセットの処理や複雑なデータの変換など、時間のかかるタスクの場合、非同期呼び出しにより、これらのタスクをフロントエンドで待機することなくバックエンドで実行できます。 ユーザーエクスペリエンスが向上します。
webアプリケーションの開発
Function Computeを他のクラウドサービスと併用して、webアプリケーションを迅速に構築できます。 非同期呼び出しを使用すると、ユーザーがフォームを送信したり、クエリを実行したり、大量のデータをロードしたりするときに、バックエンドの応答時間が長くなることによるページのフリーズを防ぐことができます。 この場合、ユーザーは遅延を経験することなくページの他の部分と対話し続けることができます。 多数のユーザーが同時にアプリケーションにアクセスする場合など、同時実行性の高いシナリオでは、非同期呼び出しでリクエストのロードを分散し、サービスのオーバーロードを防ぐことができます。
遅延呼び出し
特定のシナリオでは、非同期呼び出しリクエストを送信した後、Function Computeが関数呼び出しを延期することができます。 この場合、Function Compute APIまたはSDKを使用して、関数の呼び出しを延期できます。
HTTPリクエストヘッダーx-fc-async-delay
をコードに追加します。 有効な値: (0,3600) 。 単位は秒です。 Function Computeは、x-fc-async-delay
で指定された期間が経過すると、関数を呼び出します。
再試行ポリシー
エラー処理および再試行メカニズムは、非同期呼び出しでサポートされます。 タスクが失敗した場合、プロセス全体に影響を与えることなく、タスクを再スケジュールできます。 Function Computeは、呼び出しが失敗した場合、非同期呼び出しを自動的に再試行します。
再試行メカニズム
次の表に、一般的なエラーのデフォルトの再試行メカニズムを示します。
HTTPステータスコード | 原因 | サーバーの動作 |
200 |
| システムは、デフォルトで3回実行を再試行するか、非同期呼び出し設定のmaxAsyncRetryAttemptsの設定に基づいて実行を再試行します。 |
429 | 同時リクエストの最大数に達したため、リクエストは抑制されます。 | Function Computeは、バイナリ指数バックオフモードで最大5時間実行を再試行します。 関数の実行が失敗した場合、0.5秒後に再試行が開始されます。 後続の再試行間隔は、2進指数バックオフモードで計算される。 再試行間の待機間隔は、各試行で2倍になり、1秒、2秒、4秒、8秒などで開始されます。 このパターンは最大5時間続きます。 |
500 | システムエラーが発生します。 | |
503 | Function Computeリソースが不足しています。 |
再試行ポリシーの設定
Function Computeでは、メッセージの最大再試行回数と最大有効期間 (TTL) を指定できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
機能の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[非同期モードの設定] をクリックします。 [非同期モード設定] セクションで、[変更] をクリックします。
非同期モードの設定パネルで、次のパラメータを設定し、デプロイをクリックします。
パラメーター
説明
タスクモード
最大再試行
非同期呼び出しでのメッセージの最大再試行回数を指定します。 有効な値: [0,8] 。
デフォルトでは、Function Computeは非同期でトリガーされないメッセージに対して3回再試行します。 ビジネス要件に基づいて、非同期呼び出しの再試行回数を減らすか増やすことができます。
最大メッセージ寿命
非同期呼び出しでのメッセージの最大有効期間を指定します。 有効な値: [1,604800] 。 デフォルト値: 86400 単位は秒です。
この期間は、非同期呼び出しがトリガーされた時刻から計算されます。 最大メッセージ寿命が経過した場合、メッセージは破棄される。 破棄されたメッセージは、CloudMonitorの非同期呼び出しトリガーイベントメトリックによって追跡されます。 詳細については、「モニタリングメトリック」をご参照ください。
結果コールバック
非同期呼び出しリクエストを受信すると、Function Computeはリクエストを保持し、リクエストの実行が完了するのを待たずにすぐにレスポンスを返します。 指定された最大回数だけ再試行された後に実行されない要求を保持する場合、または非同期呼び出し結果を下流のアプリケーションに通知する場合は、結果コールバックを設定できます。 非同期呼び出しの宛先サービスを設定すると、Function Computeは実行結果に基づいて対応するサービスへのコールバックを自動的にトリガーします。
仕組み
次の図は、結果コールバックのプロセスを示しています。
シナリオ
破棄されたイベントを後で使用するために保存する
システムがリトライポリシーに基づいてリクエストを再試行した後に非同期リクエストの実行に失敗した場合、Function Computeはリクエストを破棄します。 失敗した呼び出しに対して宛先が設定されている場合、Function Computeは失敗した要求のコンテキスト情報をApsaraMQ for RocketMQなどの宛先サービスにプッシュし、その後の処理を行います。 宛先サービスを別の機能に設定することもできます。 Function Computeは、失敗したリクエストのコンテキスト情報をこの関数に自動的にプッシュして、カスタムエラー処理ロジックを実行します。
実行結果の下流サービスへの通知
呼び出しを成功させるための宛先を設定できます。 リクエストが正常に実行されると、Function Computeはリクエストのコンテキスト情報を下流の宛先サービスにプッシュします。 たとえば、Function Computeを使用してObject Storage Service (OSS) にアップロードされたZIPファイルを自動的に解凍する場合、解凍後に通知を受信する場合は、解凍関数の結果コールバックを設定できます。
非同期呼び出しでサポートされる宛先サービス
関数の非同期呼び出しの宛先を設定する場合、非同期呼び出しの結果が指定された条件を満たすと、Function Computeは指定されたサービスにリクエストのコンテキストとデータを送信します。 異なる機能、エイリアス、およびバージョンに対して異なる宛先サービスを設定できます。 非同期呼び出しでは、次の宛先サービスがサポートされます。
メッセージサービス (MNS)
Function Compute
EventBridge
ApsaraMQ for RocketMQ
ApsaraMQ for RocketMQを選択した場合、ApsaraMQ for RocketMQ 4.xインスタンスのみを移行先サービスとして設定できます。 ApsaraMQ for RocketMQ 5.xインスタンスを宛先サービスとして設定することはできません。 詳細については、「ApsaraMQ For RocketMQ 4.xと5.xの違いと互換性の説明」をご参照ください。
非同期呼び出しの宛先サービスを構成するときは、次の項目に注意してください。
非同期呼び出しの宛先に送信されるイベントコンテンツ
次のサンプルコードは、非同期呼び出しの送信先が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 Resource Name (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" }
ペイロード制限
次の項目は、さまざまな宛先サービスのペイロードサイズの制限を示しています。
MNS: 64 KB
Function Compute: 128 KB
EventBridge: 64 KB
ApsaraMQ for RocketMQ: 4 MB
ループ回避
非同期呼び出しの宛先を設定するときは、ループ呼び出しが発生しないようにしてください。 たとえば、関数aの非同期呼び出しが成功する宛先として関数Bを設定し、関数Bの非同期呼び出しが成功する宛先として関数Aを設定すると、ループが発生します。
非同期呼び出しの宛先サービスの設定
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
機能の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[非同期モードの設定] をクリックします。
呼び出しが成功するための宛先の設定
[成功した呼び出し先] セクションで、[変更] をクリックします。
[成功した呼び出しの宛先] パネルで、[成功時に他のサービスを呼び出す] を [有効にする] に設定し、[宛先サービス] パラメーターを設定します。 下表に、各パラメーターを説明します。
パラメーター
説明
宛先サービス
Function Computeを使用します。 [Destination Service] ドロップダウンリストから Function Compute を選択した場合、次のパラメーターを設定する必要があります。
関数名: 関数の名前。
VersionまたはAlias: 関数のエイリアスまたはバージョン。
MNS [宛先サービス] ドロップダウンリストから [MNS] を選択した場合、次のパラメーターを設定する必要があります。
宛先タイプ: 成功した呼び出しの結果を受け取る宛先のタイプ。 有効な値:
キュー
キューベースのメッセージングモデルは、信頼性の高い同時メッセージ消費サービスを提供します。 キュー内の各メッセージは、1つのクライアントのみが使用できます。
トピック
トピックベースのメッセージングモデルは、1つのパブリッシャークライアントから複数のサブスクライバークライアントにメッセージを送信するために使用されます。 MNSトピックは、複数のメソッドを使用してメッセージとしてプッシュできます。
キュー: MNSキューの名前を選択します。 このパラメーターは、Destination TypeパラメーターをQueueに設定した場合に必要です。
トピック: MNSトピックの名前。 このパラメーターは、Destination TypeパラメーターをTopicに設定した場合に必要です。
ApsaraMQ for RocketMQ [宛先サービス] ドロップダウンリストから [ApsaraMQ for RocketMQ] を選択した場合、次のパラメーターを設定する必要があります。
インスタンス: ターゲットインスタンス。
トピック: 宛先トピック。
EventBridgeを使用します。 [Destination Service] ドロップダウンリストから [EventBridge] を選択した場合、[Custom Event Bus] パラメーターを設定する必要があります。
[デプロイ] をクリックします。
失敗した呼び出しの宛先を設定する
[失敗した呼び出しの宛先] セクションで、[変更] をクリックします。
[失敗した呼び出しの宛先] パネルで、[失敗時に他のサービスを呼び出す] を [有効化] に設定します。 次に、Destination Serviceパラメーターを設定します。
失敗した呼び出しの宛先のパラメーターの詳細については、前の表をご参照ください。
[デプロイ] をクリックします。
コールバック失敗の処理
関数に設定されたロールに宛先サービスに対する権限がない場合、または宛先サービスが使用できない場合、宛先サービスへのコールバックは失敗する可能性があります。 このような障害は、Function Computeが提供するメトリクスとログに基づいて処理できます。 次の表に、一般的なエラーと対応するシステムアクションを示します。
HTTPステータスコード | 説明 | システムアクション |
5xx | リクエストが抑制されるか、コンテンツエラーが発生します。 | Function Computeは、指数バックオフモードでコールバックを自動的に再試行します。 最初の再試行間隔は500ミリ秒で、最大再試行時間は30分です。 |
4xx | 必要な権限がないか、リクエストパラメーターが正しくないか、リクエストメッセージの本文が宛先サービスの制限を超えています。 不正なリクエストパラメータの例は、リクエストパラメータで指定された宛先サービスのリソースが削除されたことです。 | システムはエラーを返し、エラーメッセージを記録します。 |
コールバック指標
コールバックが失敗すると、Function Computeは対応するメトリクスを記録し、コンソールにメトリクスを表示します。 Function Computeコンソールにログインできます。 左側のナビゲーションウィンドウで、 を選択します。 [関数名] 列で、管理する関数の名前をクリックします。
メトリック | 説明 |
FunctionDestinationErrors | 関数の実行中に指定された宛先をトリガーできないリクエストの数。 統計は毎分または毎時間収集されます。 |
FunctionDestinationSucceed | 関数の実行中に指定された宛先を正常にトリガーしたリクエストの数。 統計は毎分または毎時間収集されます。 |
FAQ
関数の非同期呼び出しをトリガーするにはどうすればよいですか?
次のいずれかの方法を使用して、Function Compute関数を非同期で呼び出すことができます。
Function Computeコンソールにログインし、目的の関数を見つけて、[テスト] タブで [非同期モードで関数を呼び出す] を選択します。
InvokeFunction操作を呼び出し、
x-fc-invocation-type
パラメーターの値をAsyncに設定します。サーバーレスDevsを使用して非同期呼び出しを構成します。
invocation-type
パラメーターの値をAsyncに設定します。 詳細については、「関数の呼び出し」をご参照ください。
次に何をすべきか
非同期リクエストの各フェーズのステータス情報を取得する場合は、タスクモードを有効にできます。 詳細については、「」をご参照ください。