webentwicklung-frage-antwort-db.com.de

Warum erforderlich und optional ist in Protokollpuffer 3 entfernt

Ich verwende kürzlich gRPC mit proto3 und mir ist aufgefallen, dass required und optional in neuer Syntax entfernt wurden.

Kann mir jemand erklären, warum erforderliche/optionale Elemente in proto3 entfernt wurden? Solche Einschränkungen scheinen nur notwendig zu sein, um die Definition robust zu machen.

syntax proto2:

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}

syntax proto3:

syntax = "proto3";
message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}
172
yjzhang

Der Nutzen von required stand im Mittelpunkt vieler Debatten und Flammenkriege. Auf beiden Seiten gab es große Lager. Ein Lager mochte es zu garantieren, dass ein Wert vorhanden war und bereit war, mit seinen Einschränkungen zu leben, aber das andere Lager fühlte sich required gefährlich oder nicht hilfreich an, da es nicht sicher hinzugefügt oder entfernt werden kann.

Lassen Sie mich näher erläutern, warum required -Felder sparsam verwendet werden sollten. Wenn Sie bereits ein Proto verwenden, können Sie kein erforderliches Feld hinzufügen, da alte Anwendungen dieses Feld nicht bereitstellen und Anwendungen den Fehler im Allgemeinen nicht gut behandeln. Sie können sicherstellen, dass zuerst alle alten Anwendungen aktualisiert werden, aber es kann leicht sein, einen Fehler zu machen, und es hilft nichts, wenn Sie die Protos im any -Datenspeicher speichern (auch von kurzer Dauer, wie z. B. memcached). Gleiches gilt, wenn ein erforderliches Feld entfernt wird.

Viele Pflichtfelder waren "offensichtlich" erforderlich, bis ... sie es nicht waren. Angenommen, Sie haben ein id - Feld für eine Get - Methode. Das ist offensichtlich erforderlich. Außer, dass Sie später möglicherweise das id von int in string oder von int32 in int64 ändern müssen. Dazu muss ein neues muchBetterId - Feld hinzugefügt werden. Nun verbleibt das alte id - Feld, das muss angegeben werden muss, aber schließlich vollständig ignoriert wird.

Wenn diese beiden Probleme kombiniert werden, wird die Anzahl der nützlichen Felder required begrenzt und die Lager streiten darüber, ob sie noch Wert haben. Die Gegner von required waren nicht unbedingt gegen die Idee, sondern deren aktuelle Form. Einige schlugen vor, eine aussagekräftigere Validierungsbibliothek zu entwickeln, die required zusammen mit etwas Fortgeschrittenerem wie name.length > 10 Überprüfen und gleichzeitig ein besseres Fehlermodell sicherstellen könnte.

Insgesamt scheint Proto3 die Einfachheit zu fördern, und das Entfernen von required ist einfacher. Aber vielleicht überzeugender: Das Entfernen von required machte für proto3 Sinn, wenn es mit anderen Funktionen kombiniert wurde, z. B. dem Entfernen der Feldpräsenz für Grundelemente und dem Entfernen überschreibender Standardwerte.

Ich bin kein Protobuf-Entwickler und in keiner Weise maßgebend in diesem Bereich, aber ich hoffe trotzdem, dass die Erklärung nützlich ist.

315
Eric Anderson

Die Erklärung finden Sie in diesem protobuf Github issue :

Wir haben erforderliche Felder in proto3 gelöscht, da erforderliche Felder im Allgemeinen als schädlich eingestuft werden und die Kompatibilitätssemantik von protobuf verletzen. Die Idee bei der Verwendung von protobuf ist, dass Sie Felder zu Ihrer Protokolldefinition hinzufügen/daraus entfernen können, während Sie mit neueren/älteren Binärdateien weiterhin vollständig vorwärts-/rückwärtskompatibel sind. Erforderliche Felder unterbrechen dies jedoch. Sie können einer .proto-Definition weder ein erforderliches Feld sicher hinzufügen noch ein vorhandenes erforderliches Feld sicher entfernen, da beide Aktionen die Kabelkompatibilität unterbrechen. Wenn Sie beispielsweise einer .proto-Definition ein erforderliches Feld hinzufügen, können Binärdateien, die mit der neuen Definition erstellt wurden, keine mit der alten Definition serialisierten Daten analysieren, da das erforderliche Feld in alten Daten nicht vorhanden ist. In einem komplexen System, in dem .proto-Definitionen von vielen verschiedenen Systemkomponenten gemeinsam verwendet werden, kann das Hinzufügen/Entfernen von erforderlichen Feldern leicht mehrere Teile des Systems zum Absturz bringen. Wir haben mehrere Male Produktionsprobleme gesehen, die dadurch verursacht wurden. In Google ist es praktisch überall verboten, erforderliche Felder hinzuzufügen oder zu entfernen. Aus diesem Grund haben wir Pflichtfelder in proto3 komplett entfernt.

Nach dem Entfernen von "erforderlich" ist "optional" nur redundant, sodass wir auch "optional" entfernt haben.

25
maiyang