protobuf対gRPC
ProtobufとgRPC、およびその両方の使用方法を理解しようとします。次のことを理解してください。
- OSIモデルを考慮すると、たとえば、Protobufはレイヤー4にありますか?
- メッセージ転送を通して、protobufが見逃していることをgRPCが行っている「フロー」はどのようになっていますか?
- 送信者がprotobufを使用する場合、サーバーはgRPCを使用できますか、またはgRPCはgRPCクライアントのみが配信できるものを追加しますか?
- GRPCが同期と非同期の通信を可能にできる場合、Protobufはマーシャリング専用であり、そのため状態とは何の関係もありません-trueまたはfalse?
- RESTまたはGraphQLの代わりに通信するフロントエンドアプリケーションでgRPCを使用できますか?
私はすでに知っている-または私が知っている-と仮定-
- データ交換用のバイナリプロトコル
- Googleが設計
- クライアントおよびサーバーでの説明のような生成された「構造」を使用して、メッセージのマーシャリングを解除します
- Protobufを使用(v3)
- 再びGoogleから
- RPC呼び出しのフレームワーク
- HTTP/2も使用します
- 同期および非同期通信が可能
すでにこのテクノロジーを使用している人にとっては簡単な質問だと思います。私はまだ忍耐強く助けてくれてありがとう。また、ネットワークの技術を深く掘り下げてくれたことにも本当に感謝しています。
Protocol buffers is(are?)is Interface Definition Language and serialization library:
- IDLでデータ構造を定義します。つまり、使用するデータオブジェクトを記述します。
- データオブジェクトをバイナリに変換したり、バイナリから変換したりするためのルーチンを提供します。ディスクへのデータの書き込み/読み取り用
gRPCは同じIDLを使用しますが、Protobufデータ構造をデータ型として使用してリモートプロシージャコールメソッドシグネチャを定義できる構文「rpc」を追加します。
- データ構造を定義します
- Rpcメソッド定義を追加します
- ネットワーク経由でメソッドシグネチャを提供および呼び出すコードを提供します
- 必要な場合は、Protobufを使用してデータオブジェクトを手動でシリアル化できます。
質問への回答:
- gRPCはレイヤー5、6、7で動作します。Protobufはレイヤー6で動作します。
- 「メッセージ転送」と言うとき、Protobufは転送自体に関心がありません。データ転送の両端でのみ機能し、バイトをオブジェクトに変換します
- デフォルトでgRPCを使用するということは、Protobufを使用しているを意味します。 Protobufを使用するがgRPCと相互運用するためにgRPCを使用しない独自のクライアントを作成するか、他のシリアライザーをgRPCにプラグインできますが、gRPCを使用する方が簡単です
- 本当だ
- はい、できます
実際、gRPCとProtobufはまったく異なるものです。簡単にしましょう:
- gRPCは、クライアントとサーバーが対話する方法を管理します(REST APIを使用するWebクライアント/サーバーのように)
- protobufは単なるシリアル化/逆シリアル化ツールです(JSONと同様)
gRPCには2つのサイドがあります。サーバーサイドと、サーバーにダイヤルできるクライアントサイドです。サーバーはRPC(つまり、リモートで呼び出すことができる関数)を公開します。そして、あなたはそこにたくさんのオプションがあります:あなたは(TLSを使用して)通信を保護することができます(インターセプターを使用して)認証層を追加します...
Protobufは、クライアント/サーバーである必要のない任意のプログラム内で使用できます。データを交換する必要があり、それらを厳密に入力する場合、protobufは素晴らしいオプションです(高速で信頼性が高い)。
そうは言っても、両方を組み合わせてニースのクライアント/サーバーシステムを構築できます。gRPCはクライアント/サーバーコードであり、データプロトコルをプロトバフします。
PS:Go-を使用してgRPCとprotobufでクライアント/サーバーを段階的に構築する方法を示すために paper を書きました。
grpcはgoogleによって構築されたフレームワークであり、google自体からの本番プロジェクトで使用され、#HyperledgerFabricはgrpcで構築され、grpcで構築された多くのオープンソースアプリケーションがあります
protobuffは、jsonのようなデータ表現です
grpc
- gRPCは、Googleが開発したオープンソースフレームワークです
- RPCの要求と応答を作成し、フレームワークによって残りを処理できます。
- RESTはCRUD指向ですが、grpcはAPI指向です(制約なし)
- HTTP/2の上に構築する
- >>>>>認証、ロードバランシング、モニタリング、ロギングを提供します
- [HTTP/2]
- HTTP1.1は1997年にずっと前にリリースされました
- HTTP1は、リクエストごとにサーバーへの新しいTCP接続を開きます
- ヘッダーを圧縮しません
- サーバープッシュなし、Req、Resで動作します
- 2015年にリリースされたHTTP2(SPDY)
- 多重化をサポート
- クライアントとサーバーは同じTCP接続を介してメッセージを並行してプッシュできます
- レイテンシーを大幅に削減
- HTTP2はヘッダー圧縮をサポートします
- HTTP2はバイナリです
- proto buffはバイナリなので、HTTP2に最適です
- [タイプ]
- 単項
- クライアントストリーミング
- サーバーストリーミング
- 双方向ストリーミング
- grpcサーバーはデフォルトで非同期です
- grpcクライアントは同期または非同期にすることができます
プロトバフ
- プロトコルバッファは言語に依存しない
- プロトコルバッファ(バイナリ形式)の解析は、CPUに負担をかけません
- [ネーミング]
- メッセージ名にキャメルケースを使用する
- フィールドのunderscore_seperated
- 列挙型にはキャメルケースを使用し、値名にはCAPITAL_WITH_UNDERSCOREを使用します
- [コメント]
- サポート //
- サポート /* */
- [利点]
- データは完全に入力されています
- データは完全に圧縮されています(CPU使用量が少ない)
- Schema(message)は、コードを生成してコードを読み取るために必要です
- スキーマにドキュメントを埋め込むことができます
- データはどの言語でも読むことができます
- スキーマはいつでも安全に進化できます
- xMLよりも高速
- コードは自動的に生成されます
- Googleはproto buffを発明しました。48000個のprotobufメッセージと12000.protoファイルを使用します
- Grpcを含む多くのRPCフレームワークは、プロトコルバッファを使用してデータを交換します