非同期タスクを使用すると、ビジネスステータスに関する情報をリアルタイムで取得し、関数の実行を管理できます。 これにより、アラート通知や自動再試行などの異常な問題を処理できます。 このトピックでは、Function Computeの非同期タスクのベストプラクティスについて説明します。
背景情報
Function as a service (FaaS) は、もともと、APIバックエンドサービス、画像処理、ストリーム処理など、ステートレス、短期、軽量のコンピューティングに使用されていました。 FaaS関数は、さまざまなシナリオで非同期または同期的に呼び出すことができます。 関数が同期して呼び出されると、関数は直ちに実行されます。 関数が非同期で呼び出されると、202 HttpCode
がすぐに呼び出し元に返され、非同期で呼び出されたメッセージがバックエンドサービスによる処理のためにエンキューされます。
シナリオ
ビジネスの発展により、一部のオンラインライブストリーミングビジネスはFaaSに移行しています。 このようなビジネスは、長い実行時間、高いレイテンシ感度、および高い可用性要件を特徴としています。 したがって、開発者はビジネスステータスに関する情報をリアルタイムで取得し、機能の実行を管理する必要があります。 この場合、非同期呼び出し中にレイテンシが鈍感であり、永続的な接続が不安定であり、同期呼び出し中にクライアントリソースが占有されるため、非同期呼び出しも同期呼び出しも実行できません。 同期呼び出しは、オフラインビジネスの負荷のバランスを取り、トラフィックスパイクが発生したときにダウンストリームシステムのトラフィックをスムーズにバッファリングするのに役立つため、Function Computeは非同期タスクベースの非同期呼び出しを導入します。 非同期タスクは、次のビジネスシナリオで使用できます。
観察可能な実行
メッセージがキューから削除されたか、関数がトリガーされたか、実行結果が
送信先
に送信されたかなど、実行に関する情報をリアルタイムで表示します。タスクの実行が観察されるのと同じ方法でビジネスを観察する必要があります。
特定の実行をトリガーするイベントとリアルタイム実行ログを表示します。
実行の名前、時間、またはステータスに基づいて履歴レコードをクエリします。
操作可能な実行
業務は、タスクの実行と同じ方法で操作する必要があります。
場合によっては、実行時間が長い場合、関数の実行を停止します。
実行が失敗または成功した場合は、再度実行します。
非同期タスクの詳細については、「概要」をご参照ください。
例
次の例は、Function Computeコンソールと一緒にServerless Devsを使用して、Message Service (MNS) を宛先とする非同期呼び出しを実行する方法を示しています。
非同期タスクを使用して、次の結果を取得できます。
関数の非同期実行が開始された後、Function ComputeコンソールまたはSDKを使用するか、Function Compute API操作を呼び出して実行ステータスを表示できます。
関数の実行に失敗した場合、または関数の実行が停止した場合、function Computeは非同期メッセージを指定されたMNSキューにプッシュして、無効キュー機能を使用します。 このようにして、メッセージに関する情報を取得し、後でメッセージを処理できます。
あなたが始める前に
MNSキューを作成します。 詳細については、「キューベースのメッセージングを開始する」をご参照ください。
Resource Access Management (RAM) ロールを作成し、次のポリシーをRAMロールにアタッチします。 AliyunFCDefaultRolePolicyポリシーをRAMロールにアタッチすることもできます。 詳細については、「信頼できるAlibaba CloudサービスのRAMロールの作成」をご参照ください。
{ "Version": "1", "Statement": [ { "Action": [ "fc:InvokeFunction", "mns:SendMessage", "mns:PublishMessage", "log:*" ], "Resource": "*", "Effect": "Allow" } ] }
手順
次のコマンドを実行して、プロジェクトを複製します。
git clone https://github.com/awesome-fc/Stateful-Async-Invocation.git
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd Stateful-Async-Invocation
変更します。Modify thes.yamlファイルを作成します。
最初の
{please_replace_me}
パラメーターの値をAlibaba CloudアカウントのIDに変更します。 他の2つの{please_replace_me}
パラメーターの値を、非同期呼び出し用に設定した宛先MNSキューの名前に変更します。プロジェクトディレクトリで次のコマンドを実行して、関数をデプロイします。
s deploy -y
関数のデプロイ後、function Computeコンソールにログインして、サービスと関数が作成されているかどうか、および非同期タスク機能がその関数に対して有効になっているかどうかを確認できます。
追加情報
非同期呼び出しの設定は、非同期呼び出しが実行された場合にのみ有効になります。 非同期呼び出し要求は、SDKまたはCLIツールを使用して送信できます。
この例では、サンプルプロジェクトのディレクトリで次のコマンドを実行して、非同期呼び出し要求を送信し、MNSキューを表示します。
s invoke --invocation-type async -e '{"failure":true}'
Function Computeコンソールで非同期呼び出しを表示および管理できます。 詳細については、「タスク管理」をご参照ください。
説明関数の実行ログなどの詳細情報を表示するには、関数にSimple Log Serviceを設定する必要があります。 詳細については、「ロギング機能の設定」をご参照ください。
関数の実行後、宛先が設定されている場合は、宛先に移動してプッシュレコードを表示できます。
このトピックの例では、宛先が設定されている場合、MNSコンソールで宛先にプッシュされたメッセージを受信できます。 サンプルコード:
{ "timestamp":xxxx, "requestContext":{ "requestId":"xxxx", "functionArn":"acs:fc:::services/Stateful-Invocation-demo.LATEST/functions/main", "condition":"UnhandledInvocationError", "approximateInvokeCount":1 }, "requestPayload":"{\"failure\":true}", "responseContext":{ "statusCode":200, "functionError":"UnhandledInvocationError" }, "responsePayload":"{\"errorMessage\":\"Process exited unexpectedly before completing request (duration: 13689ms, maxMemoryUsage: 10.86MB)\"}" }
説明非同期呼び出しが失敗または終了した場合、MNSでエラーに関する情報を受け取ることができます。