実行時間が長い、リソースを大量に消費する、またはエラーが発生しやすいロジックを持つ関数の場合、非同期呼び出しを使用することで、アプリケーションの応答性を向上させ、トラフィックスパイクを確実に処理できます。関数を非同期で呼び出す場合、応答を待つ必要はありません。Function Compute は、リクエストを内部キューに永続化して、信頼性の高い処理を実現します。このトピックでは、非同期呼び出しのユースケースと一般的な機能について説明します。
ユースケース
非同期呼び出しのユースケース例は次のとおりです。
オーディオおよびビデオ処理
Function Compute をオーディオおよびビデオのワークロードに使用する場合、エンコーディング、デコーディング、トランスコーディングなど、時間のかかるタスクを実行することがよくあります。これらのタスクを非同期で呼び出すことで、フロントエンドをブロックすることなくバックグラウンドで実行され、ユーザーエクスペリエンスが向上します。プロジェクトが大きい場合は、複数のタスクに分割して並列処理したり、複数の関数を非同期で呼び出してビデオを複数のフォーマットに変換したりすることもできます。これにより、全体の処理時間が短縮されます。
データ ETL 処理
抽出・変換・書き出し (ETL) パイプラインでは、ソースからデータを抽出し、変換して、宛先システムにロードするプロセスに、データベースクエリ、ファイル I/O、データクレンジングなど、複数の独立した操作が含まれる場合があります。非同期呼び出しにより、これらの操作を並列で実行できるため、処理時間が短縮され、システムパフォーマンスが向上します。大規模なデータセットの処理や複雑なデータ変換など、実行時間の長いタスクの場合、非同期呼び出しによりこれらのタスクをバックグラウンドで実行できるため、フロントエンドをブロックすることなくユーザーエクスペリエンスが向上します。
Web アプリケーションの開発
Function Compute を他のクラウドサービスと組み合わせて、Web アプリケーションを迅速に構築できます。ユーザーがフォームを送信したり、検索クエリを実行したり、コンテンツの多いページを読み込んだりするときに、非同期呼び出しを使用すると、バックエンドの応答を長時間待つことによるページのフリーズを防ぐことができます。ユーザーは、顕著なレイテンシーを経験することなく、ページの他の部分と対話し続けることができます。多数のユーザーが同時にアプリケーションにアクセスする場合など、同時実行性が高いシナリオでは、非同期呼び出しによってリクエストの負荷が分散され、サービスの過負荷を防ぐことができます。
遅延呼び出し
指定した遅延時間の後に非同期呼び出しをトリガーするように Function Compute を設定できます。
HTTP リクエストヘッダー x-fc-async-delay をコードに追加します。値は秒単位で、(0, 3600) の範囲内である必要があります。Function Compute は、実行がトリガーされるとタイマーを開始し、x-fc-async-delay で指定された遅延時間の後に関数を呼び出します。
リトライポリシー
非同期呼び出しのメカニズムには、組み込みのエラー処理とリトライ機能が備わっています。ステップが失敗した場合、システムはワークフロー全体に影響を与えることなくタスクを再スケジュールできます。非同期の関数呼び出しが失敗すると、Function Compute は自動的に呼び出しをリトライします。
リトライメカニズム
次の表に、一般的なエラーに対するデフォルトのリトライポリシーを示します。
リトライポリシーの設定
Function Compute では、最大リトライ回数とメッセージの最大有効期間をカスタマイズできます。
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、を選択します。
上部のナビゲーションバーでリージョンを選択します。関数リスト ページで、対象の関数をクリックします。
関数の詳細ページで、タスク タブをクリックし、変更 の右側にある タスクモード をクリックします。タスクモード パネルで、次のパラメーターを設定します。設定が完了したら、デプロイ をクリックします。
パラメーター
説明
タスクモード
非同期タスクに対してタスクモードを有効にするかどうかを指定します。詳細については、「非同期タスク」をご参照ください。
最大再試行回数
非同期呼び出しの最大リトライ回数。値は 0 から 8 までの整数である必要があります。
デフォルトでは、Function Compute は失敗した非同期呼び出しを 3 回リトライします。ビジネス要件に基づいてリトライ回数を調整できます。
メッセージの最大有効期間
非同期呼び出しキュー内のメッセージの最大有効期間。値は 1 から 604,800 までの整数である必要があります。デフォルト値は 86,400 です。単位:秒。
この期間は、非同期呼び出しがトリガーされた時点から計算されます。メッセージの有効期間が設定値を超えると、メッセージは破棄されます。破棄されたメッセージは、CloudMonitor の 非同期呼び出しイベント監視メトリクスによって記録されます。メトリクスの詳細については、「監視メトリクス」をご参照ください。
結果コールバック
Function Compute が非同期呼び出しリクエストを受信すると、リクエストを永続化し、リクエストの実行を待たずにすぐに応答を返します。すべてのリトライが失敗した後に破棄されるリクエストを保持したり、ダウンストリームサービスに非同期呼び出しの結果を通知したりするには、結果コールバック機能を設定します。宛先サービスを設定すると、非同期呼び出しが完了したときに、Function Compute は実行結果に基づいて対応するサービスを自動的にコールバックします。
仕組み
次の図は、結果コールバックのワークフローを示しています。
ユースケース
破棄されたイベントを後続処理のために保存する
非同期リクエストが失敗し、設定されたポリシーに基づいてすべてのリトライが失敗した場合、Function Compute はリクエストを破棄します。失敗時の宛先を設定している場合、Function Compute は失敗したリクエストのコンテキスト情報を ApsaraMQ for RocketMQ などのメッセージングサービスに自動的にプッシュして、後続処理を行います。別の関数を宛先サービスとして設定することもできます。この場合、Function Compute は失敗したリクエストのコンテキスト情報をその関数に自動的にプッシュして、カスタムのエラー処理ロジックを実行します。
実行結果をダウンストリームサービスに自動的に通知する
実行が成功した後、成功時の宛先が設定されている場合、Function Compute システムはリクエストのコンテキストをダウンストリームの宛先サービスに自動的にプッシュします。たとえば、OSS にアップロードされた ZIP ファイルを自動的に解凍するように Function Compute を設定し、完了時にメッセージ通知を受け取りたい場合は、対象の関数の結果コールバック宛先サービスを設定できます。
サポートされている宛先サービス
非同期呼び出しの結果が設定された条件を満たす場合、Function Compute はリクエストのコンテキストとデータを指定された宛先サービスにプッシュします。異なる関数、エイリアス、バージョンに対して異なる宛先サービスを設定できます。非同期呼び出しでサポートされている宛先サービスは次のとおりです。
Simple Message Queue (formerly MNS)
Function Compute
EventBridge
ApsaraMQ for RocketMQ
ApsaraMQ for RocketMQ の 4.0 シリーズインスタンスのみを宛先サービスとして設定できます。5.0 シリーズインスタンスはサポートされていません。
宛先サービスのペイロード制限については、「関数のランタイムリソースの制限」をご参照ください。
非同期呼び出しの宛先の設定には、次のものが含まれます。
非同期呼び出しの宛先のイベントコンテンツ
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 (旧称: MNS): 64 KB
Function Compute: 「関数のランタイムリソースの制限」に記載されている制限に従います。
EventBridge: 64 KB
ApsaraMQ for RocketMQ: 4 MB
呼び出しループの回避
非同期実行の宛先を設定する際は、呼び出しループを作成しないようにしてください。たとえば、関数 A の成功した呼び出しの宛先として関数 B を設定し、関数 B の成功した呼び出しの宛先として関数 A を設定したとします。この場合、関数 A を非同期でトリガーして正常に実行されると、A から B へ、そして B から A へという呼び出しループが発生する可能性があります。
宛先サービスの設定
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択します。関数リスト ページで、対象の関数をクリックします。
関数の詳細ページで、タスク タブをクリックし、変更 の右側にある [編集] をクリックします。[タスクの宛先] パネルで、次のパラメーターを設定します。設定が完了したら、デプロイ をクリックします。
成功時の宛先の設定
成功時に他のサービスを呼び出す を [有効化] に設定し、成功した実行の宛先サービスを設定します。パラメーターは次のとおりです。
パラメーター
説明
送信先サービス
Function Compute。Function Compute を宛先サービスとして選択する場合、次のパラメーターを設定する必要があります。
[関数名]: 宛先関数の名前を指定します。
[バージョンまたはエイリアス]: 関数のエイリアスまたはバージョンを指定します。
Simple Message Queue (formerly MNS)。Simple Message Queue (formerly MNS) を宛先サービスとして選択する場合、次のパラメーターを設定する必要があります。
[宛先タイプ]: 宛先タイプを選択します。有効な値:
[キュー]:
[トピック]:
[キュー]: Simple Message Queue (formerly MNS) キューの名前を選択します。このパラメーターは、キュー を キュー に設定した場合に必要です。
[トピック]: Simple Message Queue (formerly MNS) トピックの名前を選択します。このパラメーターは、トピック を トピック に設定した場合に必要です。
ApsaraMQ for RocketMQ。ApsaraMQ for RocketMQ を宛先サービスとして選択する場合、次のパラメーターを設定する必要があります。
[インスタンス]: 宛先インスタンスを選択します。
[トピック]: 宛先トピックを選択します。
EventBridge。EventBridge を宛先サービスとして選択する場合、[カスタムイベントバス] を指定する必要があります。
失敗時の宛先の設定
失敗時に他のサービスを呼び出す を [有効化] に設定し、失敗した実行の宛先サービスを設定します。パラメーターは、成功時の宛先と同じです。
コールバックの失敗
権限不足やサービスの利用不可により、宛先サービスへのコールバックが失敗することがあります。Function Compute は、トラブルシューティングに使用できる関連メトリクスとログを提供します。次の表に、一般的なエラーとそれに対応するシステムの動作を示します。
エラーコード | 原因 | システムの動作 |
5xx | スロットリングまたはコンテンツエラー。 | Function Compute システムは、エクスポネンシャルバックオフに基づいて自動的にリトライを実行します。初期リトライ間隔は 500 ms で、最大リトライ期間は 30 分です。 |
4xx | 権限の欠落、無効なリクエストパラメーター (例:宛先リソースが削除された場合)、またはリクエストボディが宛先サービスの制限を超えている。 | エラーを返し、エラー情報を記録します。 |
結果コールバックのメトリクス
宛先サービスへのコールバックが失敗した場合、Function Compute は対応するメトリクスをコンソールに記録します。Function Compute コンソールにログインできます。左側のナビゲーションウィンドウで、 を選択します。次に、[関数名] リストで、対象の関数の名前をクリックしてそのメトリクスを表示します。
メトリクス名 | 説明 |
宛先呼び出しエラー (FunctionDestinationErrors) | 非同期関数呼び出しの宛先を呼び出す試みが失敗した回数。メトリクスは、1 分あたりまたは 1 時間あたりの合計で集計されます。 |
宛先呼び出し成功 (FunctionDestinationSucceed) | 非同期関数呼び出しの宛先を呼び出す試みが成功した回数。メトリクスは、1 分あたりまたは 1 時間あたりの合計で集計されます。 |
監視メトリクスの詳細については、「監視メトリクス」をご参照ください。
よくある質問
非同期呼び出しをトリガーする方法
Function Compute で関数を非同期に呼び出すには、次のいずれかの方法を使用できます。
Function Compute コンソールにログインし、対象の関数を見つけて テスト タブに移動し、非同期で呼び出します。 を選択してから、関数のテスト をクリックします。
InvokeFunction API を呼び出し、
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説明Web 関数の呼び出し:たとえば、Flask を使用し、
@app.route('/test')として定義されたルートを持つ Python 関数をテストする場合、$pathをtestに置き換えます。@app.route('/')として定義されたルートを持つ Python 関数をテストする場合、HTTP トリガーのパブリックエンドポイントを直接呼び出します。イベント関数の呼び出し:HTTP トリガーのパブリックエンドポイントを直接呼び出します。
次のステップ
各段階での非同期リクエストのステータスを追跡するには、タスクモードを有効にします。詳細については、「非同期タスク」をご参照ください。