非同期呼び出しリクエストを受信すると、Function Computeはリクエストを保持し、リクエストの実行が完了するのを待たずにすぐにレスポンスを返します。 指定された最大回数だけ再試行された失敗したリクエストを保持する場合、または非同期呼び出し結果を下流のアプリケーションに通知する場合は、結果コールバック機能を構成できます。 宛先サービスを設定した後、Function Computeは、非同期呼び出しリクエストが実行されると、実行結果に基づいてサービスを自動的にコールバックします。
制御ポリシー機能の動作
次の図は、結果コールバックのプロセスを示しています。
シナリオ
破棄されたイベントを後で使用するために保存する
システムが再試行ポリシーに基づいてリクエストを繰り返し実行しようとしても、非同期リクエストの実行に失敗した場合、Function Computeはリクエストを破棄します。 失敗した呼び出しに対して送信先が設定されている場合、Function Computeは失敗した要求のコンテキスト情報をApsaraMQ for RocketMQなどのメッセージサービスにプッシュして処理します。 別の機能を宛先サービスとして設定することもできます。 Function Computeは、失敗したリクエストのコンテキスト情報をこの関数に自動的にプッシュして、カスタムエラー処理ロジックを実行します。
実行結果の下流サービスへの通知
リクエストが正常に実行されると、Function Computeはリクエストのコンテキスト情報を下流の宛先サービスにプッシュします。 たとえば、Object Storage Service (OSS) にアップロードされたZIPファイルを自動的に解凍するようにFunction Computeを設定し、ZIPファイルの解凍後に通知を受信する場合は、解凍関数の結果コールバック機能を設定できます。
非同期呼び出しでサポートされる宛先サービス
関数の非同期呼び出しの宛先を設定する場合、非同期呼び出しの結果が指定された条件を満たすと、function Computeは指定されたサービスにリクエストのコンテキストとデータを送信します。 異なる機能、エイリアス、およびバージョンに対して異なる宛先サービスを設定できます。 非同期呼び出しでは、次の宛先サービスがサポートされます。
メッセージサービス (MNS)
Function Compute
EventBridge
ApsaraMQ for RocketMQ
宛先サービスとして設定できるのはイベント関数だけです。 Function Computeでは、HTTP関数を宛先サービスとして設定できません。 イベント関数とHTTP関数の詳細については、「関数タイプの選択」をご参照ください。
非同期呼び出しの宛先サービスを構成するときは、次の項目に注意してください。
非同期呼び出しの宛先に送信されるイベントコンテンツ
次のサンプルコードは、MNS、Function Compute、またはApsaraMQ for RocketMQが非同期呼び出しの宛先として設定されている場合のイベントコンテンツの例を示しています。
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:::services/{serviceName}/functions/{functionName}", "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:::services/xxxx.LATEST/functions/xxxx" }, "requestPayload": "", "responsePayload": "", "responseContext": { "functionError": "", "statusCode": 200 }, "timestamp": 1660120276975 }, "subject": "acs:fc:::services/xxxx.LATEST/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を設定します。
非同期呼び出しの宛先を構成する
非同期呼び出しの宛先を設定する前に、関数を作成し、サービス内の関数によって使用されるロールに関連するAlibaba Cloudサービスに対する権限があることを確認する必要があります。 次の項目は、対応するクラウドサービスで必要な権限を示しています。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。
MNS: mns:SendMessageまたはmns:PublishMessage
Function Compute: fc:InvokeFunction
EventBridge: eventbridge:PutEvents
Apache RocketMQのメッセージキュー: mq:PUB
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
[関数] ページで、管理する関数の名前をクリックします。 関数の詳細ページで、[非同期設定] タブをクリックします。
非同期設定タブで、ビジネス要件に基づいてパラメーターを設定します。
呼び出しが成功するための宛先の設定
[成功した呼び出し先] セクションで、[変更] をクリックします。
[成功した呼び出しの宛先の変更] パネルで、[成功時に他のサービスを呼び出す] を [有効化] に設定し、宛先サービスパラメーターを設定します。 次の表に、Destination Serviceパラメーターを示します。
パラメーター
説明
宛先サービス
Function Computeを使用します。 [Destination Service] パラメーターに [Function Compute] を選択した場合、次のパラメーターを設定する必要があります。
サービス名: Function Computeのサービスの名前。
VersionまたはAlias: 指定されたサービスのエイリアスまたはバージョン。
関数名: サービス内の関数の名前。
説明宛先サービスとして設定できるのはイベント関数だけです。 HTTP関数は、Function Computeの宛先サービスとして設定できません。
MNS [Destination Service] パラメーターに [MNS] を選択した場合、次のパラメーターを設定する必要があります。
宛先タイプ: 成功した呼び出しの結果を受け取る宛先のタイプ。 有効な値:
キュー
キューベースのメッセージングモデルは、信頼性の高い同時メッセージ消費サービスを提供します。 キュー内の各メッセージは、1つのクライアントのみが使用できます。
トピック
トピックベースのメッセージングモデルは、1つのパブリッシャークライアントから複数のサブスクライバークライアントにメッセージを送信するために使用されます。 MNSトピックは、複数のメソッドを使用してメッセージとしてプッシュできます。
キュー: MNSキューの名前。 このパラメーターは、Destination TypeパラメーターがQueueに設定されている場合に必要です。
Theme: MNSトピックの名前。 このパラメーターは、Destination TypeパラメーターがTopicに設定されている場合に必要です。
ApsaraMQ for RocketMQ [Destination Service] パラメーターに [ApsaraMQ for RocketMQ] を選択した場合、次のパラメーターを設定する必要があります。
インスタンス: ApsaraMQ for RocketMQインスタンス。
トピック: ApsaraMQ for RocketMQトピックの名前。
EventBridgeを使用します。 [Destination Service] パラメーターとして [EventBridge] を選択した場合、[Custom Event Bus] パラメーターを設定する必要があります。
[OK] をクリックします。
失敗した呼び出しの宛先を設定する
[失敗した呼び出しの宛先] セクションで、[変更] をクリックします。
[失敗した呼び出しの宛先の変更] パネルで、[失敗時に他のサービスを呼び出す] パラメーターの [有効化] を選択し、[宛先サービス] パラメーターを設定します。
失敗した呼び出しの宛先サービスの構成は、成功した呼び出しの場合と同様です。 詳細については、このトピックの「正常な呼び出しの宛先の設定」をご参照ください。
[OK] をクリックします。
関数がトリガーされた後、関数の実行が成功または失敗したときに、設定された宛先サービスから次の情報を表示できます。
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:::services/{serviceName}/functions/{functionName}", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }
コールバック失敗の処理
サービスロールに宛先サービスに対する権限がない場合、または宛先サービスが使用できない場合、宛先サービスへのコールバックは失敗する可能性があります。 Function Computeが提供するメトリクスとログに基づいてエラーを処理できます。 次の表に、一般的なエラーと対応するシステムアクションを示します。
エラーコード | 説明 | システムアクション |
5xx | リクエストが抑制されるか、コンテンツエラーが発生します。 | Function Computeは、指数バックオフモードでコールバックを自動的に再試行します。 最初の再試行間隔は500ミリ秒で、最大再試行時間は30分です。 |
4xx | 十分な権限がないか、リクエストパラメーターが正しくないか、リクエストメッセージの本文が宛先サービスの制限を超えています。 不正なリクエストパラメータの例は、リクエストパラメータで指定された宛先サービスのリソースが削除されたことです。 | システムはエラーを返し、エラーメッセージを記録します。 |
結果コールバック指標
コールバックが失敗すると、Function Computeは対応するメトリクスを記録し、コンソールにメトリクスを表示します。 Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。 表示されるページで、[サービス名] 列でメトリクスを表示するサービスの名前をクリックします。 次の表に、宛先サービスの呼び出しのメトリックを示します。
メトリック | 説明 |
FunctionDestinationErrors | 関数の非同期呼び出しに対して宛先が構成されているときに、関数の実行中に宛先をトリガーできないリクエストの数。 統計は毎分または毎時間収集されます。 |
FunctionDestinationSucceed | 関数の非同期呼び出しに対して宛先が構成されているときに、関数の実行中に宛先をトリガーするリクエストの数。 統計は毎分または毎時間収集されます。 |
メトリクスの詳細については、「モニタリングメトリクス」をご参照ください。
関連ドキュメント
API操作を呼び出すか、Serverless Devsを使用して非同期呼び出しの宛先サービスを構成することもできます。 詳細については、「APIリファレンス」および「Serverless Devsコマンド」をご参照ください。
HTTP関数は、Function Computeのコールバックの宛先サービスとして使用できません。 ただし、HTTP関数は同期呼び出しと非同期呼び出しをサポートします。 詳細については、「概要」をご参照ください。
結果コールバック機能を設定するときに、非同期タスクモードを有効にできます。 詳細については、「概要」をご参照ください。