gRPCとは? アーキテクチャ、ストリーミング、APIのトレードオフ

gRPCとは? アーキテクチャ、ストリーミング、APIのトレードオフ

Scrapeless Universal Scraping APIは、許可された公的ウェブコンテンツを取得し、gRPCが実際の応答で観察される必要がある場合にはJavaScriptをレンダリングできます。

要点

  • gRPCには正確なプロトコルの役割があります。 gRPCは、クライアントが生成されたクライアントとサーバーコードを介して別のプロセス上の型付きサービスメソッドを呼び出すオープンソースのリモートプロシージャコールフレームワークです。
  • gRPCは正しいレイヤーで読まれる必要があります。 トランスポート、表現、ブラウザポリシー、およびアプリケーションの承認は別々の懸念事項として残ります。
  • 中間者はアプリケーションが観察する内容を変更できます。 ゲートウェイ、キャッシュ、ブラウザのデフォルト、およびクライアントライブラリは、ソースバイトと解析されたデータの間に処理を追加できます。
  • バリデーションにはコンテンツの証拠が必要です。 ステータスまたはフィールド単体では、期待される公的表現が到着したことを証明しません。
  • セキュリティはスコープとバリデーションに依存します。 プロトコルの構文は、リソースへのアクセスや呼び出し元から提供された値を信頼する権限を与えることはありません。

gRPCとは?

gRPCは、クライアントが生成されたクライアントとサーバーコードを介して別のプロセス上の型付きサービスメソッドを呼び出すオープンソースのリモートプロシージャコールフレームワークです。サービス契約は一般的に.protoファイルに記述され、プロトコルバッファはメッセージをエンコードし、HTTP/2はエンドポイント間のコールを運びます。ローカルコールの外観はプログラミングモデルであり、すべてのコールは遅延、部分的な失敗、承認、および互換性の懸念とともにネットワーク境界を越えます。

有用な定義にはメカニズムとその境界の両方が含まれます。gRPCは交換の特定の部分に影響を与えますが、隣接する責任はHTTP、ブラウザ、選択されたトランスポート、アプリケーション、またはサーバーのデータモデルに残ります。これらのレイヤーを分けておくことで、エラーレポートが再現可能になり、構成変更がアクセス制御の判断と誤解されるのを防ぎます。

API開発者にとって、最初の質問は誰が価値や振る舞いを生み出すのかということです。次の質問は、誰がそれを解釈するのかということです。最後の質問は、どのような可観測な結果がその解釈が機能したことを証明するのかということです。この三つの回答が用語集の用語をテスト可能なインターフェース契約に変えます。

gRPCコールがネットワークを越える方法

サービス定義はメソッドに名前を付け、リクエストおよびレスポンスメッセージタイプを割り当てます。プロトコルバッファコンパイラと特定の言語に特化したgRPCプラグインが、その定義をクライアントスタブおよびサーバーインターフェースに変換します。アプリケーションコードがスタブを呼び出す一方で、生成されたコードがリクエストをシリアライズし、コールをフレーム化し、メタデータを送信し、呼び出し元の言語でレスポンスを再構築します。

HTTP/2はgRPCに対してストリーム、フロー制御、ヘッダー圧縮、および永続的な接続を持つ多重化トランスポートを提供します。いくつかの呼び出しは、ひとつのHTTP/1.1リクエストキューとして表現されることなく、一つの接続を共有できます。そのトランスポートの選択は同時サービストラフィックに役立ちますが、アプリケーションの締切や負荷分散、キャパシティ制限は依然として明示的な設計を必要とします。

gRPCはユニキャストコール、サーバーストリーミングコール、クライアントストリーミングコール、および双方向ストリーミングをサポートします。ユニキャストコールは従来のリクエストとレスポンスに密接に対応しています。ストリーミングメソッドは、結果がインクリメンタルに到着する場合や両方のピアが更新を交換する必要がある場合に便利な、順序付けられたメッセージフローを一方向または双方向にオープンに保ちます。

ステータスコードとトレーリングメタデータは、呼び出しの結果を伝えます。トランスポート接続が成功しても、リモートメソッドがアプリケーションレベルの失敗を返すことがありますので、モニタリングはgRPCのステータス、メソッド名、経過時間、および選択されたレスポンスメタデータを記録するべきです。オープンなHTTP/2接続を成功の証拠として扱うべきではありません。

gRPCサービス契約の読み方

以下の用語は、多くの場合、1つのラベルにまとめられているコンポーネントを区別します。それらをネットワークトレースの装飾ではなく、参加者間のインターフェースとして読み取ってください。

サービス

リモートで呼び出せるメソッドの名前付きコレクション。サーバーがサービスを実装し、クライアントはそのために生成されたスタブを受け取ります。

RPCメソッド

1つのリクエストタイプと1つのレスポンスタイプまたはストリーム形状をペアにする契約。メソッド名は公開インターフェースの一部になる。

メッセージ

番号付けされたフィールドで構成された型付きプロトコルバッファレコード。フィールド番号、ソースコードのプロパティの順序ではなく、値をワイヤ上で識別します。

メタデータ

メッセージデータの前または後に送信されるキー・バリュー情報。認証コンテキスト、トレーシング識別子、レスポンスの詳細を伝達することがよくあります。

締切

呼び出し元が待つことを望む期間の上限。締切の伝播は、結果がもはや役に立たない後に下流の作業が続くのを防ぎます。

チャネル

ターゲットへの接続を管理するクライアント側の抽象化。チャネルは、メソッドの呼び出しごとに新しい接続を開くのではなく、呼び出しの間で再利用できます。

なぜgRPCがウェブデータ収集で重要なのか

gRPCは、どのバイトが到着するか、これらのバイトがどのように解釈されるか、またはブラウザコードが結果を観察できるかどうかを変更することがあります。収集ワークフローは、ツールを変更する前にその影響を特定するべきです。要求されたURL、最終URL、レスポンスステータス、表現タイプ、関連するプロトコルフィールド、期待されるコンテンツマーカーを記録します。そのコンパクトな記録は、正しいページとアクセスメッセージ、同意画面、リダイレクトターゲット、空のアプリケーションシェル、または互換性のないエンコーディングを区別します。

直接HTTPは、必要なデータがオープンサーバーによって生成された応答に存在する場合、最も単純な取得経路です。承認されたコンテンツがJavaScriptの実行、ブラウザ管理の状態、ナビゲーション、またはブラウザのセキュリティポリシーに依存している場合、ブラウザが関連します。2つの経路は必ずしも同一に見える必要はありません:ブラウザはプラットフォームのルールに従ってクッキー、圧縮、リダイレクト、CORS、およびストレージを管理しますが、直接クライアントは異なるデフォルトのセットを露出します。

セッションの継続性は、1つの応答が次のリクエストの状態を確立する際に重要です。認可されたシーケンスを1つの制限されたクライアントコンテキスト内に保持し、必要なロケールとネットワークの起源を保持し、無関係なジョブの状態を混合するのを避けてください。プロキシはネットワークの起源を変更します。ヘッダーを再現したり、表現をデコードしたり、スクリプトを実行したり、制限されたコンテンツへのアクセスを許可したりすることはありません。

パースは、表現の検証が完了した後にのみ開始されます。最終的なホスト、利用可能な場合の標準的な識別子、メディアタイプ、デコード状態、必要なビジネスマーカーを確認してからフィールドを抽出してください。この順序により、パーサーがエラードキュメントを技術的に成功した空のレコードに変換することを防ぎます。

仲介者には明示的な注意が必要です。コンテンツ配信ネットワークはエンコードされたバリアントを選択でき、ゲートウェイはOPTIONSに応答でき、キャッシュは交渉された応答を再利用でき、アプリケーションサーバーはクッキーや認証フィールドを設定できます。最終ページ出力とアプリケーションコードのみを比較すると、決定を行ったかもしれないレイヤーをスキップします。

Scrapeless Universal Scraping APIは、チームが許可された公開コンテンツの管理された取得を必要とする際に関係があります。 acquisitions 契約は、ターゲット、許可されたフィールド、期待される表現、受け入れマーカー、停止条件を定義するべきです。製品の機能は、ソースの条件、プライバシーのレビュー、またはアプリケーションレベルの検証を置き換えるものではありません。

gRPCがうまく適合する場所

gRPCは、具体的な製品の動作、互換性要件、または診断の決定を変更するときにアーキテクチャ内に位置付けられます。これらのユースケースは、最初に仕事を説明し、次にプロトコル機能を説明します。

内部サービス呼び出し

チームは、サービス間で1つのスキーマを共有し、いくつかの実装言語に対して一貫したクライアントを生成できます。

インクリメンタルな結果配信

サーバーストリーミングは、1つの大きな最終ボディを待つのではなく、利用可能になるとすぐにレコードを送信できます。

テレメトリーと制御プレーン

双方向ストリームは、明示的な型契約を維持しながら進行中の状態変化を運ぶことができます。

モバイルからバックエンドへの呼び出し

コンパクトなメッセージは、クライアントプラットフォームとゲートウェイ戦略が計画されている場合、転送されるバイトを削減できます。

ポリグロットシステム

.proto契約は、gRPCツールチェーンがサポートする言語間の手動翻訳を削減できます。

厳密なAPI進化

番号付きメッセージフィールドと互換性ルールは、チームが古いフィールドを再解釈することなくフィールドを追加するための規律ある方法を提供します。

gRPCとJSON、RESTスタイルのHTTP APIの比較

gRPCは、両方の側がスキーマを共有し、サポートされるコードジェネレーターを使用できるときに最も強力です。JSON-over-HTTP APIは、通常のブラウザやコマンドラインツールで検査するのが簡単であり、消費者が疎結合を重視する公開統合に適合します。選択は契約およびエコシステムの決定であり、普遍的な速度ランキングではありません。

次元gRPC関連する概念または代替案
契約型付きサービスとメッセージスキーマリソースパスとメディアタイプスキーマ
ワイヤ形式通常はプロトコルバッファしばしばJSONですが、HTTPは他の形式も許可します
ストリーミングメソッドの形状に組み込まれていますいくつかの異なるHTTPメカニズムを通じて可能です
ブラウザのアクセス通常、ゲートウェイまたはブラウザ指向のクライアントが必要です通常のHTTPエンドポイントに対するネイティブフェッチサポート
デバッグgRPCに対応したツールと有効にされたリフレクションが最適です一般的なHTTPツールで読みやすい

比較がレイヤー境界を保持する場合にのみ有用です。2つのメカニズムは1つのリクエストで共存する可能性があり、1つを置き換えることで自動的にもう1つを置き換えるわけではありません。選択された動作を入力、観測可能な出力、失敗状態、所有権の観点から文書化してください。

一般的なgRPC設計の誤り

  • リモートコールをローカルとして扱うこと。 リモート作業はタイムアウト、キャンセル、または呼び出し元が待機を停止した後に完了する可能性があります。メソッド名は、高価な状態の変更動作を隠してはいけません。
  • 期限を無視すること。 期限がないと、そのビジネスの価値が切れた後に作業がキューに残る可能性があります。現実的な制限を設定し、それを下流の呼び出しに伝播させてください。
  • フィールド番号の変更。 名前を変更されたフィールドは番号を保持できますが、削除された番号を再利用すると古いメッセージと新しいメッセージが不一致になる可能性があります。スキーマで削除された識別子を予約してください。
  • デフォルトでストリーミングを選択します。 ストリームはそのライフタイムの間、接続およびアプリケーションリソースを消費します。製品の動作を変更するインクリメンタル交換が必要な場合はストリーミングを使用してください。
  • ブラウザの互換性を前提とする。 通常のブラウザフェッチコードは、すべてのgRPCトランスポートの動作を公開しません。ブラウザがクライアントの場合、gRPC-WebまたはHTTPゲートウェイを計画してください。
  • メッセージ本文を無分別にログする。 型付きペイロードには認証情報や個人データが含まれる場合があります。運用ログにはメソッド、ステータス、タイミング、および承認された識別子を優先してください。

ほとんどの障害は、ライブラリやブラウザが自動的に行ったことに関する仮定を取り除いた後に診断が容易になります。最小限のトレースをキャプチャし、秘密を削除し、制御された変数を一度に1つ変更してください。目標は返された表現の安定した説明であり、無関係なヘッダー調整のコレクションではありません。

実践的なgRPC評価チェックリスト

このシーケンスは、ローンチ前のデザインレビューおよび動作変更後の生産診断として機能します。それはプロトコルの証拠をアプリケーションの結果に結びつけます。

  1. フレームワークラッパーを選択する前にサービス契約を作成し、各メソッドが単一であるか、本当にストリームが必要であるかを確認します。
  2. すべての呼び出し言語とランタイムをリストし、その後、各言語の公式サポートとコード生成の所有権を確認します。
  3. 期限、キャンセル動作、最大メッセージの期待、ステータスマッピングをAPI契約の一部として定義します。
  4. 古いクライアントと新しいサーバーでスキーマの進化をテストし、互換性の仮定を明らかにするためにペアを逆転させます。
  5. ブラウザ、外部パートナー、およびデバッグツールがサービスに到達する方法を決定し、その境界が現実的である場合にのみゲートウェイを追加します。
  6. 代表的な同時性の下でエンドツーエンドの呼び出しの動作を測定し、下流の時間やシリアル化コストを含めます。
  7. 許可されるメタデータキーを文書化し、秘密や制御されていないユーザー入力がトレースやログに入らないようにします。

レビューを終えるには、小さな受け入れられたサンプルと、同じ削除ルールでの拒否されたサンプルを保存します。未来の変更は、既知のページの識別、期待されるフィールド、およびデコードされたコンテンツに対して比較されることができます。

セキュリティ、メタデータ、オブザーバビリティ

トランスポートのセキュリティは、転送中のバイトを保護しますが、どの呼び出し元がメソッドを呼び出せるかは決定しません。ピアを認証し、要求された操作を承認し、サービスの境界で各メッセージを検証します。生成された型は多くの形状エラーを防ぐが、ビジネスバリデーションを置き換えるものではありません。

メタデータは、他のプロトコルのヘッダーと同じレビューに値します。認証値はプラットフォームの承認された認証パスを使用し、トレース値は制限されるべきです。サーバーは、クライアントライブラリがリクエストを生成したからといって、メタデータが信頼できると仮定してはいけません。

役立つgRPCテレメトリーは、接続の健全性とメソッドの健全性を分離します。メソッドレベルの遅延、ステータス、キャンセル、期限切れ、および応答サイズのバンドを記録します。これにより、敏感なメッセージ本文を取得せずに遅い依存関係が可視化されます。

gRPCを定義する標準

公式なgRPCの紹介 サービス、生成されたスタブ、プロトコルバッファを定義します。この主要な情報源は、この記事で使用される語彙と境界を修正しますが、実装動作は選択されたクライアントとデプロイメントで観察する必要があります。

gRPCのコア概念ガイド 単一およびストリーミングメソッドの形状を説明します。この主要な情報源は、この記事で使用される語彙と境界を修正しますが、実装動作は選択されたクライアントとデプロイメントで観察する必要があります。

HTTP/2仕様 gRPCによって使用される多重化トランスポートを定義します。この主要な情報源は、この記事で使用される語彙と境界を修正しますが、実装動作は選択されたクライアントとデプロイメントで観察する必要があります。

プロトコルバッファの概要 スキーマ言語とバイナリメッセージフォーマットを説明します。この主要な情報源は、この記事で使用される語彙と境界を修正しますが、実装動作は選択されたクライアントとデプロイメントで観察する必要があります。

1文で表すgRPCの決定

型付き共有契約、生成されたクライアント、およびファーストクラスストリーミングが具体的なサービス間の問題を解決する場合はgRPCを選択し、オープンインスペクションと広範なクライアントの到達がより重要な場合は単純なHTTP表現を選択します。

そのルールを受け入れテストに入れます。どの参加者が信号を送信し、どの参加者がそれを解釈し、どの仲介者がパスを変更でき、どのコンテンツマーカーが成功を証明するかを明記します。これにより、gRPCは障害が発生した後に貼り付けられたラベルではなく、観察可能なシステムの一部となります。

公的なWebレスポンスを検証する準備はできましたか?

Scrapeless Universal Scraping APIを使用して、承認された公的コンテンツを取得し、このガイドで説明された表現契約を確認してください。

今すぐサインアップして $5の無料クレジットをゲットクレジットカードは不要.

$5のクレジットを請求する→

FAQ

gRPCはプロトコルバッファと同じですか?

いいえ。gRPCはRPCフレームワークと呼び出しモデルであり、プロトコルバッファは一般的にそのインターフェース定義とメッセージエンコーディングを提供します。HTTP/2トランスポート、ステータス管理、期限、生成されたサービスコードなどの他の懸念は、シリアル化フォーマット単独ではなくgRPCに属します。

gRPCは常にHTTP/2を使用しますか?

主流のgRPC実装はトランスポートにHTTP/2のセマンティクスを使用します。ブラウザ向けのバリアントやゲートウェイは異なるエッジを公開できますので、アーキテクチャ図ではネイティブgRPCのホップと翻訳されたHTTPインターフェースを区別すべきです。

ブラウザはgRPCサービスに直接呼び出すことができますか?

ブラウザは通常、gRPC-WebサポートまたはHTTPゲートウェイが必要です。つまり、普通のブラウザネットワークAPIは完全なネイティブgRPCトランスポートを公開しません。ゲートウェイは公共契約の一部となり、別に監視されるべきです。

gRPCは常にHTTPのJSONよりも速いですか?

No. ペイロードサイズとシリアル化はgRPCを有利にする可能性がありますが、エンドツーエンドのパフォーマンスはサービスの作業、ネットワークの状態、接続の再利用、メッセージサイズ、およびクライアントの実装にも依存します。全体的な主張を行う前に、実際のワークフローを測定してください。

gRPC APIはどのように進化するべきですか?

gRPC APIは互換性のあるフィールドを追加し、既存のフィールド番号を保持し、削除された識別子を予約し、古いクライアント-サーバーのペアリングと新しいペアリングをテストするべきです。メソッドの動作とステータスの意味は.protoファイルと共に互換性レビューが必要です。

参考文献