Function Compute は gRPC プロトコルをサポートしています。HTTP トリガーを使用して gRPC サービスを呼び出すことができます。この場合、関数は gRPC サーバーとして機能し、クライアント側のストリーミングおよび非ストリーミングリクエストを処理します。これにより、サーバーレスアーキテクチャの弾力的なスケーリングと O&M フリーの機能を利用できます。
使用上の注意
呼び出しメソッド
ドメイン名:
fcapp.runサブドメインまたはカスタムドメイン名を使用して gRPC 関数を呼び出すことができます。説明カスタムドメイン名を使用する場合は、リクエストパスと関数の間のマッピングを構成する必要があります。リクエストパスを
/*に設定することをお勧めします。この設定により、すべての gRPC リクエストが対応する gRPC 関数に転送され、その関数がリクエストをクライアントで定義された gRPC メソッドにルーティングします。ポート: gRPC リクエストのポートは
8089です。
伝送セキュリティ
gRPC リクエストのセキュリティを確保するため、Function Compute のオンライン環境では、Transport Layer Security (TLS) プロトコルを使用するクライアントのみがサポートされます。TLS クライアントを使用しない場合、
rpc error: code = Unavailable desc = connection closed before server preface receivedエラーが報告されます。カスタムドメイン名は、カスタム HTTPS 証明書をサポートします。gRPC サーバーは TLS 証明書の検証を定義する必要はありません。Function Compute ゲートウェイレイヤーが TLS 検証を実行します。
リクエストタイムアウト制御
gRPC リクエストの最大タイムアウトは、関数の [実行タイムアウト] を超えることはできません。 デフォルトの [実行タイムアウト] は 60 秒で、最大 86,400 秒です。
リクエスト同時実行制御
Function Compute の同時実行数は gRPC リクエストを制御します。各 gRPC リクエストは 1 単位の同時実行数を消費します。gRPC プロトコルは HTTP/2 に基づいています。Function Compute では、関数インスタンスに割り当てられた gRPC リクエストは同じ HTTP/2 接続を共有します。この HTTP/2 接続の同時ストリーム数は、インスタンスの同時実行数と同じです。関数のインスタンスごとの同時実行数を設定して、インスタンス上の同時ストリーム数を制御できます。詳細については、「インスタンスごとの同時実行数の設定」をご参照ください。
負荷分散
Function Compute は、gRPC リクエストを異なる関数インスタンスに分散させることで、自動的に負荷分散を実行します。
課金方法
gRPC リクエストは、次のタイプに分類されます。
通常の gRPC リクエスト
クライアント側のストリーミングリクエスト
サーバー側のストリーミングリクエスト
双方向ストリーミングリクエスト
Function Compute では、リソース使用量 = 仕様 × 課金期間 となります。課金期間は、以下で説明するように、通常の gRPC リクエストとストリーミング gRPC リクエストで異なります。
通常の gRPC リクエスト:
同時実行数が 1 の関数の場合、課金期間はリクエストの開始から終了までです。
同時実行数が 1 より大きい関数の場合、課金期間は最初のリクエストの開始から最後のリクエストの終了までです。インスタンスが複数のリクエストを同時に処理する場合、繰り返し課金されることはありません。
次の図に示すように、関数の同時実行数は 2 です。最初のリクエストは T1 に到着し、T3 に終了します。2 番目のリクエストは T2 に到着し、T4 に終了します。課金期間は T1 から T4 までです。T2 から T3 までの期間は 1 回だけ課金され、繰り返し課金されることはありません。
クライアント側のストリーミング、サーバー側のストリーミング、および双方向ストリーミングリクエスト: 課金期間は、最初の gRPC 接続の開始から最後の gRPC 接続が閉じられるまでです。
前提条件
手順
次のコマンドを実行してプロジェクトを初期化します。
sudo s init fc-custom-golang-grpc -d fc-custom-golang-grpc次のコマンドを実行して、プロジェクトディレクトリ
fc-custom-golang-grpcに移動します。cd fc-custom-golang-grpc現在のプロジェクトディレクトリで、s.yaml ファイルを編集します。
以下は例です。
edition: 3.0.0 name: hello-world-app # 現在のアプリケーションに必要なキー情報を設定します。 # キー設定の詳細については、https://www.serverless-devs.com/serverless-devs/command/config を参照してください # キーが使用される順序の詳細については、https://www.serverless-devs.com/serverless-devs/tool#密钥使用顺序与规范 を参照してください access: default # キーのエイリアス。必要に応じて変更してください。 resources: helloworld: # ビジネス名またはモジュール名。 component: fc3 actions: # カスタム実行ロジック。アクションの詳細については、https://www.serverless-devs.com/serverless-devs/yaml#行为描述 を参照してください pre-deploy: # デプロイ前に実行します。 - run: go mod tidy path: ./code - run: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o target/main main.go path: ./code props: region: cn-shanghai # アプリケーションがデプロイされるリージョン。必要に応じて変更してください。 functionName: "fc-custom-golang-grpc" handler: index.handler role: '' description: 'hello world by serverless devs' timeout: 60 diskSize: 512 internetAccess: true layers: - acs:fc:cn-shanghai:official:layers/Go1/versions/1 customRuntimeConfig: port: 8089 command: - ./main runtime: custom.debian10 cpu: 0.35 instanceConcurrency: 2 memorySize: 512 environmentVariables: PATH: >- /opt/Go1/bin:/usr/local/bin/apache-maven/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/ruby/bin:/opt/bin:/code:/code/bin LD_LIBRARY_PATH: >- /code:/code/lib:/usr/local/lib:/opt/lib:/opt/php8.1/lib:/opt/php8.0/lib:/opt/php7.2/lib code: ./code/targetsudo s deploy -yを実行して関数をデプロイします。コマンドが実行されると、関数は Function Compute にデプロイされます。Function Compute は、関数のテストに使用できるパブリックにアクセス可能な URL を生成します。
HTTP トリガーを作成し、そのパブリック URL を取得します。詳細については、「トリガーの作成」をご参照ください。

次のコマンドを実行して、gRPC クライアントの実行に必要な依存関係をインストールします。
go mod vendor次のコマンドを実行して gRPC クライアントを呼び出します。これにより、gRPC 呼び出しが開始され、関数がテストされます。
fc-custang-grpc-*****.cn-shanghai.fcapp.runは、ステップ 5 で取得したトリガーのパブリック URL です。go run ./greeter_client -addr fc-custang-grpc-*****.cn-shanghai.fcapp.run:8089
gRPC 関数にカスタムドメイン名を設定し、そのカスタムドメイン名を使用して gRPC リクエストを送信することもできます。詳細については、「カスタムドメイン名は gRPC プロトコルをサポートします」をご参照ください。
よくある質問
関数のエラー
クライアントがエラー rpc error: code = Internal desc = server closed the stream without sending trailers を返した場合、Function Compute サーバーが gRPC リクエストを異常に早期終了したことを示します。このタイプのエラーは関数のエラーです。たとえば、関数がタイムアウトする、関数プロセスが異常終了する、またはメモリ不足 (OOM) エラーが発生するなどです。関数のログでエラーの原因を確認し、エラーのトラブルシューティングを行うことができます。詳細については、「呼び出しログの表示」をご参照ください。
TLS プロトコルクライアントを使用しない GRPC リクエスト
gRPC リクエストを呼び出すには、TLS プロトコルクライアントを使用する必要があります。そうしないと、エラー rpc error: code = Internal desc = server closed the stream without sending trailers が返されます。たとえば、Golang の場合、次のサンプルコードを使用できます。
var opts []grpc.DialOption
cred := credentials.NewTLS(&tls.Config{
InsecureSkipVerify: false,
})
opts = append(opts, grpc.WithTransportCredentials(cred))
conn, err := grpc.Dial(*addr, opts...)InsecureSkipVerify の値は、TLS 証明書の検証をスキップする場合は true に、TLS 証明書の検証をスキップしない場合は false に設定できます。