デシリアライズ処理に関する質問があります。私は、最初のバイトがタグと対応するon-wiretypを記述していると考えました。しかし、メッセージ内で同じタグ/識別子とデータ型を使用する2つのサービスの場合はどうでしょうか?アドバイス でprotobuffコンパイラはどのサービスと同じ識別子/タグを持つメッセージを区別しますか?
おかげでテオ
デシリアライズ処理に関する質問があります。私は、最初のバイトがタグと対応するon-wiretypを記述していると考えました。しかし、メッセージ内で同じタグ/識別子とデータ型を使用する2つのサービスの場合はどうでしょうか?アドバイス でprotobuffコンパイラはどのサービスと同じ識別子/タグを持つメッセージを区別しますか?
おかげでテオ
いるProtobufは、実際には2つの区別はありません!次の2つのメッセージを考えてみましょう。
message Foo {
int32 foo = 5;
}
message Bar {
int32 bar = 5;
}
これらのメッセージはまったく同じように見えます。その理由は、メッセージにスキーマが含まれていないためです。これにより、メッセージがよりコンパクトで処理が速くなり、軽微な欠点が誤って解釈される可能性があります。
gRPCを使用している場合、メッセージは同じように表示される場合がありますが、送信されるサービスによって区別することができます。たとえば、次のようにメッセージを送信するとき
service MyService {
rpc EatTheFoo(Foo) returns (Bar);
}
service YourService {
rpc GoToTheBar(Bar) returns (foo);
}
は、両方のサービスを取ると同じように表示されるメッセージを受信した場合でも、gRPCは、サービスとメッセージの名前が含まれます。
その後、Foo
メッセージが続いている
POST /MyService/EatTheFoo HTTP/2
:ボンネットの下に、それは次のようになりますHTTP/2リクエストに変わります。誤って誰かがBar
メッセージを送信しようとした場合、サーバーはメソッド名が間違っていることを確認し、RPCを拒否します。したがって、誤解される可能性はかなり小さいです。
ありがとうございました。それはとてもうまく説明します。 – Theodor