HTTP triggers support asynchronous

現在、Alibaba Cloud の Function Compute は、イベント関数と HTTP 関数の 2 種類の関数をサポートしています。HTTP 関数は HTTP トリガーと組み合わせることで、ユーザーが RESTful API を使用した HTTP リクエストで直接関数を呼び出すことができます。これにより、Function Compute が提供する SDK を統合しなくても関数呼び出しを実現でき、既存のシステムコンポーネントや Web サービスとの連携が容易になります。

HTTP 関数は Web シナリオを目的として設計されたため、非同期呼び出しはサポートされていませんでした。しかし、HTTP 関数の利用シナリオが増えるにつれ、非同期呼び出しがサポートされないことは、より広範な用途での制約となっていました。

非同期呼び出しがサポートされないことによる課題とはどのようなものでしょうか。

現在、Function Compute と HTTP トリガーを使用して Web サービスを構築している多くのお客様が、ファイル (動画、画像など) のトランスコーディング処理、タスクの配信、負荷テストなどのニーズを抱えています。これらの要件は、実行時間の長さやトラフィックの不均一性といった特徴を持つことが多く、同期実行シナリオでは以下のような課題があります。

関数の実行時間が長いと、関数エラーのリスクが高まり、マシンのオーバーヘッドも増加します。

・クライアント側で長時間の接続維持が必要となり、ネットワークの変動やユーザーのタイムアウトにより接続が中断されることで、関数エラーの発生確率が高まります。

・シナリオ例:動画サイトでユーザーが動画トランスコーディングをリクエストした場合、ページのリフレッシュに時間がかかり、接続中断によりトランスコーディングが失敗します。

・長時間の接続維持はクライアント側のマシンオーバーヘッドを増加させ、リソースの利用率を低下させます。

トラフィックの急増にスムーズに対応できません。

・同時実行制限があるシナリオでは、トラフィックの急増が同期呼び出しで制限され、エラー処理を行わない場合にリクエストが失敗します。

・シナリオ 1:パルス負荷テスト

・シナリオ 2:期間限定オンラインプロモーション

これらのシナリオでは、非同期呼び出しにより HTTP トリガーと関数の実行を分離し、処理効率と成功率を向上させ、オーバーヘッドを削減できます。少なくとも 1 回の呼び出し保証、ターゲット配信機能、可観測性と制御性を備えた非同期タスクモードにより、関数ホスティングサービスの利便性を最大限に享受できます。

HTTP トリガーが非同期呼び出しをサポートしていない場合、ユーザーは関数のチェーンを通じて間接的に非同期呼び出しを実現する必要がありました。具体的なプロセスは以下の通りです。

ユーザーは 2 つの関数を作成します。関数 A は HTTP で同期呼び出し可能な HTTP 関数、関数 B は関数 A から SDK 経由で非同期呼び出しされるイベント関数です。ただし、この方法にも明らかな欠点があります。

・コストが高い:各非同期呼び出しに 2 つのトリガーが必要です。

・フロー制御のフルマネージド化が実現できない:1 層目の関数が同期呼び出しのため、トラフィック急増時にユーザー側での適応処理が必要になります。

・開発・保守コストの増加:非同期機能を使用するために 2 つの関数の開発と保守が必要です。

新機能:HTTP トリガーでの非同期呼び出しサポート

Function Compute で HTTP トリガーの非同期呼び出し機能が新たにサポートされました。この機能を利用するには、HTTP 関数と HTTP トリガーを各 1 つ用意する必要があります。

Function Compute コンソール、SDK、または Serverless Devs ツールを使用して HTTP 関数とトリガーを作成できます。HTTP トリガーはユーザー側で設定可能です。設定しない場合、HTTP 関数の作成時にデフォルトのトリガーが自動作成されます。

HTTP トリガーでは、リクエストヘッダーの X-Fc-Invocation-Type で呼び出し方式を指定します。デフォルトは同期呼び出しです。非同期呼び出しを行う場合は、リクエストヘッダーに {"X-Fc-Invocation-Type": "Async"} を追加します。

HTTP 非同期呼び出しのテスト

・コンソールからのテスト

関数コードページで非同期呼び出しのオプションを選択してテストを実行します。

テスト画面で非同期呼び出しを選択することで、非同期呼び出しのテストを実行できます。

・cURL からのテスト

・テスト結果の確認

トリガー完了後、関数はリクエスト受信の結果を即座に返します。ステータスコード 202 はリクエストが正常に受信されたことを示し、その他のコードはエラーが発生したことを示します。リクエストヘッダーにはリクエスト ID も返され、この ID で非同期リクエストの実行状況を追跡できます。リクエストの実行状況をより詳しく把握し、関数の実行を制御するために、非同期タスクを有効にできます。

コンソールでリクエスト ID を使用して実行結果のログを照会できます。

非同期タスクが有効なリクエストについては、非同期タスク一覧からステータスの監視とクエリを行えます。

非同期実行結果のコールバックについては、関数コールバックのドキュメントを参照してください。

https://help.aliyun.com/document_detail/422720.html

ベストプラクティス

HTTP トリガーによる動画トランスコーディングを例に、Serverless Devs とコンソールを組み合わせて HTTP トリガーの非同期タスクを実現する方法を説明します。

前提条件:

・Serverless Devs のインストール

・Serverless Devs の設定

・テストで使用する OSS バケットの作成

・RAM ロールの作成と OSSFullAccess 権限ポリシーの付与。AliyunFCDefaultRolePolicy ポリシーを直接使用することもできます。権限ポリシーの詳細については、RAM ロールの作成を参照してください。

操作手順:

1. プロジェクトの初期化

2. プロジェクトディレクトリに移動してデプロイ

3. HTTP トリガーを通じて非同期呼び出しを実行

4. コンソールにログインしてタスクのステータスを確認・制御

5. 関数のコールバック

必要に応じて、dest-fail または dest-succ に処理ロジックを追加し、トランスコーディング関数の実行結果のコールバック関数として、実行結果の取得と通知を行えます。

まとめ

HTTP トリガーが非同期呼び出しをサポートしたことで、Function Compute をフルマネージドプラットフォームとした Web サービス構築の最後のピースが揃い、HTTP トリガーのユーザーはすぐに使える非同期呼び出しの利便性を体験できるようになりました。

Related Articles

Explore More Special Offers

  1. Short Message Service(SMS) & Mail Service

    50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00

phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.