2016-07-13 14 views
1

Say zu übertragen, habe ich eine Protokollpuffer Nachricht (in proto3) der Formältere Dienste neuere Versionen von Protokollpuffern 3 Meldungen

message A { 
    int32 foo = 1; 
} 

Ich bin mit Server X, Y und Z in Go geschrieben, nutze diese Nachrichten und übergib sie mit gRPC, so dass X mit Y spricht und Y mit Z spricht, dh X und Z sprechen über Y.

Alice entwirft eine coole, neue Funktion, die ein neues Feld, einen Balken, zu Nachricht A und aktualisiert Server X und Z.

message A { 
    int32 foo = 1; 
    int32 bar = 2; 
} 

Die implementierte Version von Server Y erkennt dieses neue Feld jedoch nicht, und das Umsetzen von Server Y, um dies zu erreichen, würde in größeren Systemen schnell sehr schwierig werden.

In einem früheren Leben haben wir Proto2 verwendet, und das alles hat gut funktioniert, weil es die unerkannten Felder herum hielt. Google empfiehlt jedoch, dass wir proto3 mit gRPC verwenden und meines Wissens nach wird das Nicht-Behalten von nicht erkannten Feldern zumindest in Go nicht mehr unterstützt.

Was ist die empfohlene Methode, um dieses Problem mit Proto3 zu beheben?

Update:
Es ist eine offene Frage Github zu diesem https://github.com/google/protobuf/issues/272

+0

Können Sie näher auf "... halten Sie die unerkannten Felder herum."? – Mark

+0

Server Y würde die Feldleiste als "unbekannte Felder" beim Entpacken beibehalten, wenn er das Proto von Z empfangen würde. Wenn Y wiederum marshallen und dieses an X senden würde, würde die Leiste immer noch im Drahtformat enthalten sein. Daher würde X auch den Inhalt von bar erhalten, anstatt dass er bei Y gelöscht wird. –

+0

Wie Sie sagen, scheint dies eine absichtliche Änderung zwischen den Protokollversionen zu sein [proto2] (https://developers.google.com/ protocol-buffers/docs/proto # updating): "... unbekannte Felder werden nicht verworfen, und wenn die Nachricht später serialisiert wird, werden die unbekannten Felder serialisiert ..." in [proto3] (https://developers.google.com/protocol-buffers/docs/proto3#updating): "... unbekannte Felder werden verworfen, wenn die Nachricht deserialisiert wird ...". Ich würde lieber mit Proto2 statt Mix-Versionen bleiben. – Mark

Antwort

0

Sie braucht ein beliebiges Feld für die zukünftige Erweiterung hinzufügen:

https://developers.google.com/protocol-buffers/docs/proto3#any

Ich habe nicht verwendet es selbst, aber wenn ich richtig verstehe, sollten auch unbekannte Feldwerte bleiben, wenn die Nachricht entschlüsselt und neu codiert wird.

+0

jeder hilft bei Submeldungen und funktioniert wie Erweiterungen von Proto2. Es ist definitiv eine Teillösung; Es behandelt jedoch nicht alle Probleme. –