[protocol-buffers] 프로토콜 버퍼 3에서 필수 및 옵션이 제거 된 이유

나는 최근에 사용하고 있습니다 gRPCproto3, 나는 것으로 나타났습니다 requiredoptional새로운 구문에서 제거되었습니다.

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필드를 드물게 사용해야 하는 이유에 대해 더 자세히 설명하겠습니다 . 이미 프로토를 사용하고 있다면 이전 응용 프로그램은 해당 필드를 제공하지 않으며 일반적으로 응용 프로그램은 오류를 잘 처리하지 못하므로 필수 필드를 추가 할 수 없습니다. 이전의 모든 응용 프로그램을 먼저 업그레이드 할 수 있지만 실수를하기 쉬울 수 있으며 임의의 데이터 저장소에 metocache를 저장하는 경우에도 도움이되지 않습니다 . 필수 필드를 제거 할 때 동일한 상황이 적용됩니다.

많은 필수 필드는 “명백하게”요구 될 때까지 … 메소드에 대한 id필드 가 있다고 가정 해 봅시다 Get. 즉됩니다 분명히 필요합니다. 나중에 나중에 idint에서 string으로, int32에서 int64 로 변경해야 할 수도 있습니다 . 이를 위해서는 새로운 muchBetterId필드를 추가해야합니다. 이제 지정 해야하는 이전 id필드 가 남아 있지만 결국 완전히 무시됩니다.

이 두 가지 문제가 합쳐 required지면 유익한 분야 의 수가 제한되고 캠프는 여전히 가치가 있는지 논쟁합니다. 반대자 required들은 반드시 아이디어에 반대하는 것이 아니라 현재의 형태에 반대했다. 더 나은 실패 모델을 확인하면서 required보다 고급의 것을 확인할 수있는보다 표현적인 검증 라이브러리를 개발할 것을 제안한 사람들 name.length > 10도 있습니다.

Proto3는 전체적으로 단순성을 선호하는 것으로 보이며 required제거가 더 간단합니다. 그러나 required프리미티브에 대한 필드 존재 제거 및 재정의 기본값 제거와 같은 다른 기능과 결합 할 때 proto3에 대한 의미를 제거하는 것이 더 설득력이 있습니다.

나는 프로토 버프 개발자가 아니며 주제에 대해 권위있는 사람은 아니지만 설명이 유용하기를 바랍니다.


답변

protobuf Github 문제 에서 설명을 찾을 수 있습니다 .

필수 필드는 일반적으로 유해하고 프로토 타입의 호환성 의미를 위반하는 것으로 간주되므로 proto3에서 필수 필드를 삭제했습니다. protobuf를 사용하는 전체 아이디어는 프로토콜 정의에서 필드를 추가 / 제거하면서 최신 바이너리 및 이전 바이너리와 완전히 호환 가능하다는 것입니다. 필수 필드는 이것을 깨뜨립니다. 필수 필드를 .proto 정의에 안전하게 추가 할 수 없으며, 기존의 필수 필드를 안전하게 제거 할 수 없습니다.이 두 가지 조치로 인해 와이어 호환성이 손상되기 때문입니다. 예를 들어, 필수 필드를 .proto 정의에 추가하면 새 정의로 작성된 바이너리는 필수 필드가 이전 데이터에 없기 때문에 이전 정의를 사용하여 직렬화 된 데이터를 구문 분석 할 수 없습니다. 복잡한 시스템에서. 프로토 타입 정의는 시스템의 여러 구성 요소에서 광범위하게 공유되므로 필수 필드를 추가 / 제거하면 시스템의 여러 부분이 쉽게 중단 될 수 있습니다. 이로 인해 생산 문제가 여러 번 발생했으며 Google은 모든 사용자가 필수 입력란을 추가 / 삭제할 수 없도록 금지하고 있습니다. 이러한 이유로 우리는 proto3에서 필수 필드를 완전히 제거했습니다.

“필수”를 제거한 후 “선택적”은 중복이므로 “선택적”도 제거했습니다.


답변