私は最近gRPC
をproto3
と共に使用しています、そして私はrequired
とoptional
が新しい構文で削除されたことに気付きました。
Proto3で必須/オプションが削除された理由を誰かが親切に説明できますか?そのような種類の制約は、定義を堅牢にするために必要なようです。
構文proto2:
message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3;
}
構文proto3:
syntax = "proto3";
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
}
required
の有用性は多くの議論と炎の戦争の中心にありました。両側に大規模な野営地がありました。あるキャンプは価値があることを保証し、その限界を守って生きることを望んでいましたが、もう一方のキャンプは安全に追加または削除できないのでrequired
が危険または役に立たないと感じました。
required
フィールドを控えめに使用する必要がある理由について、もう少し説明しましょう。あなたが既にプロトを使っているのであれば、古いアプリケーションはそのフィールドを提供しておらず、一般にアプリケーションは失敗をうまく処理できないので、あなたは必須フィールドを追加することができません。あなたはすべての古いアプリケーションが最初にアップグレードされることを確実にすることができます、しかし間違いを犯すことは容易であるかもしれません、そして、あなたがプロトをany datastoreに保存しているなら助けにはなりません。 memcached)必須フィールドを削除するときにも同じことが当てはまります。
多くの必須項目は「明らかに」必須項目でした…そうではありませんでした。 id
メソッド用のGet
フィールドがあるとしましょう。それは明らかに必須です。ただし、後でid
をintからstringに、またはint32からint64に変更する必要があります。そのためには新しいmuchBetterId
フィールドを追加する必要があります。古いid
フィールドはそのまま残されていますが、必須を指定する必要はありますが、最終的には完全に無視されます。
これら2つの問題を組み合わせると、有益なrequired
フィールドの数が制限され、それでもまだ価値があるかどうかについて異議が唱えられます。 required
の反対者は必ずしもその考えに反対しているのではなく、その現在の形式です。また、required
をname.length > 10
のようなより高度なものと一緒にチェックできる表現力豊かな検証ライブラリを開発することを提案する人もいましたが、それと同時により良い失敗モデルを持つようにしてください。
Proto3全体は単純さを好むように思われます、そしてrequired
の削除はより簡単です。しかし、もっと説得力のあることに、required
を削除することは、他の機能と組み合わせると、proto3にとって意味がありました。
私はprotobuf開発者ではありませんし、この問題について絶対に権威がありませんが、それでも説明が役に立つことを願っています。
あなたはこれで説明を見つけることができます protobuf Github issue :
必須フィールドは一般に有害でprotobufの互換性セマンティクスに違反すると見なされるため、proto3で必須フィールドを削除しました。 protobufを使用することの全体的なアイデアは、それがあなたがまだ新しい/より古いバイナリと完全に前方/後方互換性を保ちながらあなたのプロトコル定義からフィールドを追加/削除することを可能にするということです。しかし必須フィールドはこれを破ります。 .proto定義に必須フィールドを安全に追加することはできませんし、既存の必須フィールドを安全に削除することもできません。これらのアクションは両方ともワイヤの互換性を損なうためです。たとえば、.proto定義に必須フィールドを追加した場合、必須フィールドは古いデータに存在しないため、新しい定義でビルドされたバイナリは古い定義を使用してシリアル化されたデータを解析できません。 .proto定義がシステムのさまざまなコンポーネント間で広く共有されている複雑なシステムでは、必須フィールドを追加または削除すると、システムの複数の部分が簡単に停止する可能性があります。これによって何度も制作上の問題が発生しています。Google内では必要なフィールドを追加/削除することはだれにも禁止されています。このため、proto3では必須フィールドを完全に削除しました。
"required"の削除後、 "optional"は単なる冗長なので、 "optional"も削除しました。