Protocol Buffersで異なるスキーマで通信した場合の影響について
Protocol Buffers でバージョン違いのスキーマで通信した場合に、クライアントとサーバーでデータをどのように受け取るのか調べました。 gRPC を採用したい方々など参考にしてください。
TL;DR
結果としては受け取り側のスキーマが適用され、不要なフィールドが無視されたり、デフォルト値が適用されたりします。
クライアント -> サーバーへの通信の場合
クライアントからサーバーへの通信の場合はサーバー側が使っているスキーマが使われます。 例えばクライアントが使っているスキーマ のフィールドが多い場合、サーバー側の受け取るデータはそれを無視します。 逆にクライアント側のフィールドが足りていない場合、サーバー側の受け取るデータはデフォルト値が適用されます。
例えば、クライアントが使っているスキーマのフィールドが多い場合、
message Request {
string type = 2;
string message = 1;
bool is_active 3;
}
サーバーが is_active
を削除して、description
を追加した場合、
message Request {
string type = 2;
string message = 1;
reserved 3;
string description = 3;
}
この場合はサーバーのスキーマが適用され、is_active
は無視され、 description
にはデフォルト値が適用されます。
{
type: "get",
message: "this is test",
description: ""
}
サーバー -> クライアントの通信の場合
サーバーからクライアントへの通信の場合はクライアント側が使っているスキーマが使われます。 これもクライアント側で定義していないフィールドは無視され、サーバーから送られてこなかったフィールドはデフォルト値が適用されます。