Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

열람용기록

Techniques 본문

Read the F. Manual/Protocol Buffer

Techniques

OptiFree 2021. 5. 19. 23:24
 

Techniques  |  Protocol Buffers  |  Google Developers

This page describes some commonly-used design patterns for dealing with Protocol Buffers. You can also send design and usage questions to the Protocol Buffers discussion group. Streaming Multiple Messages If you want to write multiple messages to a single

developers.google.com

 

이 페이지는 Protocol Buffer를 다룰 때 일반적으로 사용되는 디자인 패턴을 소개합니다. 디자인이나 사용에 대한 문의를 Protocol Buffers discussion group 에 문의 할 수도 있습니다.

여러 메시지 스트리밍

만약 여러개의 메시지를 하나의 파일 또는 스트림에 쓰려고 한다면, 하나의 메시지가 어디서 끝나고 다음이 어디서 시작하는지 스스로 관리해야 합니다. Protocol Buffer의 wire포맷은 자체적으로 구획화가 되지 않기 때문에 protocol buffer 파서는 어디가 메시지의 끝인지 결정할 수 없습니다. 이 문제를 해결하는 가장 쉬운 방법은 각 메시지별로 메시지를 쓰기 전에 메시지의 사이즈를 적는 것입니다. 이를 다시 읽어들일 때 사이즈를 먼저 읽고 그 사이즈 크기만큼 버퍼 바이트를 분리하고 이를 파싱하면 됩니다. (만약 각 분리하는 버퍼를 카피하는 것을 피하고 싶다면 CodedInputStream 클래스 - C++, Java 에 모두 있습니다 - 를 참고하세요. 이 클래스는 특정 바이트 숫자로 제한하여 읽을 수 있습니다.)

큰 데이터 셋

Protocol Buffer는 큰 메시지를 다루기 위해 설계되지 않았습니다. 일반적인 경험에 의하면, 1 메가바이트를 넘는 메시지를 다루는 경우 다른 전략을 고민해 봐야 합니다.

즉 Protocol Buffer는 큰 데이터 셋 안에 있는 각각의 메시지를 다루는데 좋습니다. 보통 큰 데이터 셋은 작은 조각의 컬렉션이고 그 작은 조각은 큰 데이터의 구조화된 조각입니다. Protocol Buffer가 한 번에 모든 데이터 셋을 다루지 못하더라도, 각 조각을 protocol buffer를 사용하여 인코딩 하는 것은 문제를 대단히 단순화 합니다. 그렇게 되면 구조체들을 다루는 대신 바이트 문자열들을 다루는 것으로 충분합니다.

Protocol Buffer는 큰 데이터 셋을 위한 기본 지원을 하지 않는데, 다른 상황들은 다른 해결 방법을 필요로 하기 때문입니다. 가끔은 자료의 간단한 리스트가 필요할 때도 있고 데이터베이스와 같이 더 많은 기능을 원할 때도 있습니다. 각각의 솔루션은 필요한 사람만 비용을 지불해서 사용할 수 있도록 분리된 라이브러리로 개발되어야 합니다.

자가 서술 메시지 (Self-describing Messages)

Protocol Buffer는 자신의 타입의 대한 서술을 가지고 포함하지 않습니다. 따라서 대응하는 .proto 파일이 없는 raw 메시지만을 가지고서는 의미있는 데이터를 추출하기 어렵습니다.

그러나 .proto파일의 내용은 protocol buffer를 시용하여 표현될 수 있습니다. 소스코드 패키지에 있는 src/google/protobuf/descriptor.proto 파일에서는 메시지 타입을 정의합니다. Protocol Buffer 컴파일러는 —descriptor_set_out 옵션을 이용하여 .proto 파일들을 표현하는 FileDescriptorSet 를 출력할 수 있습니다. 이를 이용하면 아래와 같이 자가서술하는 프로토콜 메시지를 정의할 수 있습니다.

syntax = "proto3";

import "google/protobuf/any.proto";
import "google/protobuf/descriptor.proto";

message SelfDescribingMessage {
  // Set of FileDescriptorProtos which describe the type and its dependencies.
  google.protobuf.FileDescriptorSet descriptor_set = 1;

  // The message and its type, encoded as an Any message.
  google.protobuf.Any message = 2;
}

 

DynamicMessage 클래스를 이용하면 (C++, Java에서 가능합니다) 자가 서술 메시지 (SelfDescribingMessage) 를 다룰 수 있는 출력 도구를 만들 수 있습니다.

이 기능을 Protocol Buffer 라이브러리에 포함하지 않은 것은 Google 내부에서도 한 번도 사용한 적이 없기 때문입니다.

이 테크닉은 descriptor를 이용하는 dynamic message의 지원을 필요로 합니다. 자가 서술 메시지를 사용하기 전에 사용하는 플랫폼에서 이 기능을 지원하는지 확인하세요.

'Read the F. Manual > Protocol Buffer' 카테고리의 다른 글

Style Guide  (0) 2021.05.19
Encoding  (0) 2021.05.19