Protocol Buffers

Remote Procedure Call で使われてきたデータフォーマットが、XMLのXML-RPC、JSONのJSON-RPCと使われてきましたが、どちらもHTTPのテキストデータであることから、バイナリデータのサイズが大きくなったり、データ変換の効率が悪かったりしました。そこでgRPCというHTTP/2のストリーム多重化通信の上に、バイナリデータを効率よく送ることができるフォーマットProtocol Buffersを最近よく見かけるようになりました。(gRPCのロードバランシングとか)
そこで、構造データのシリアライズ(marshalling)、デシリアライズ(unmarshalling)をしている部分を実際にためしてみました。(バイナリデータを確認)

「HTTP/2 packet」
https://decode.red/net/archives/79

Protocol Buffersの優れているところは開発言語を選ばないことです。.protoというファイルにデータ構造を定義すると、そのファイルからさまざまな言語のインターフェイスとなるコードを生成してくれます。これを利用してデータ変換をします。
ここではGo言語でテストしました。
またKubernetesの管理KVSであるetcdのValue値にもProtocol Buffersのエンコードが使われているようです。

「kubernetesのetcd上のデータを読み解く」
https://qiita.com/kuro_1116/items/358e82547e25c1c60820

あらゆるデータフォーマットの共通化は、この世界の過去の事例を見ても難しいことですが、データにアクセスする仕組み共通化するというアイディアによって、現実的になった感があります。

環境)
Mac Ventura / M2

参考)
https://qiita.com/nozmiz/items/fdbd052c19dad28ab067

コンパイラのダウンロード
https://github.com/protocolbuffers/protobuf/releases/
https://github.com/protocolbuffers/protobuf/releases/download/v23.4/protoc-23.4-osx-aarch_64.zip

内容

% ls bin
protoc
% ls include/google/protobuf
any.proto duration.proto struct.proto
api.proto empty.proto timestamp.proto
compiler field_mask.proto type.proto
descriptor.proto source_context.proto wrappers.proto

protoc は、$GOPATH/bin に、include/googleフォルダは、コンパイルする.protoファイルと同じ場所に配置。

プラグインインストール

go get google.golang.org/protobuf/cmd/protoc-gen-go

確認

% protoc –version
libprotoc 23.4
% protoc-gen-go –version
protoc-gen-go v1.31.0

.proto ファイル取得

wget https://raw.githubusercontent.com/protocolbuffers/protobuf/main/examples/addressbook.proto

コンパイル

protoc addressbook.proto –go_out=./

下記に出力

github.com/protocolbuffers/protobuf/examples/go/tutorialpb/addressbook.pb.go

テストプログラム

https://github.com/protocolbuffers/protobuf/tree/main/examples/go/cmd

add_person でユーザ情報をコンソールからインタラクティブに登録してファイルに書き出し、list_peopleでファイルを読み込んで表示します。

addressbook.pb.go がローカルでインポートできなかったため、(tutorialpbがgithubにないためか・・相対パスは禁止) 禁じ手ですが、/opt/homebrew/Cellar/go/1.20.5/libexec/src/example におきました。(要ソース変更)

実行の様子

—-

.protoファイルから Go言語ソースを生成し、それを呼び出してアプリケーションadd_person.go、list_people.goを作っています。

import変更部分

//pb “github.com/protocolbuffers/protobuf/examples/go/tutorialpb”
pb “example”

バイナリデータを確認できたことで、理解がふかまりました。

アメリカの物理学者リチャード・フィリップス・ファインマンの名言に「自分に作れないものは、理解できない」というものがあります。最近新しい概念やキーワードが飛び交うクラウド関連の学習をしていて特に響く言葉です。
今回のテストでもいろいろとドキュメントはあるのですが、実際に最後までやったものがなかったため、試すことにしました。こういうことはこれまでもよくあります。

まだまだ、調べたいことばかりですが、一つずつ消化していきたいと思います。

addressbook.proto

addressbook.pb.go

add_person.go

list_people.go

About

Categories: 未分類 タグ: