爆速・軽量・型安全!ソフトウェアエンジニアがProtobufを選ぶこれだけの理由
「Protocol Buffers(通称 Protobuf)」ですね。かしこまりました! これ、エンジニアの世界では「超スゴ腕の収納アドバイザー」みたいなものなんですよ。
鏡の前に座ってリラックスしてくださいね。ハサミを動かしながら、分かりやすく解説していきます!
美容院で例えると、お客様のカルテをどうやって保管するかって話なんです。
JSON(これまでの主流)
「名前は〇〇様、前回のカットは3cmで……」と、誰でも読める普通のノートに書く感じ。分かりやすいけど、かさばるし書くのが大変。
Protobuf 「名前ID1、長さ3」という風に、あらかじめ決めたルール(スキーマ)に従って、超コンパクトな「専用の箱」に詰め込む感じ。
とにかく速い・軽い
バイナリ形式(0と1の羅列)にするので、JSONより通信量が劇的に減ります。スマホのギガ節約にもなるんです。
型がしっかりしている
「ここは数字!」「ここは文字!」と厳格に決めるので、バグが混入しにくい。
多言語対応
美容師(Go言語)と受付(TypeScript)と言葉が違っても、Protobufという共通ルールがあればスムーズに連携できます。
まずは「カルテのフォーマット」を決めるところから始めます。.proto という拡張子のファイルを作ります。
syntax = "proto3";
package beauty_salon;
// これが「カルテ」の設計図!
message Customer {
int32 id = 1; // ID番号
string name = 2; // お名前
string hair_style = 3; // 希望の髪型
}
この設計図を、各言語(Python, Go, Javaなど)で使えるコードに自動変換します。protoc という専用のツール(バリカンみたいなものです!)を使います。
「カルテを作って、それをギュッと圧縮して保存する」流れを見てみましょう。
import customer_pb2 # 自動生成されたコードをインポート
# 1. カルテを作成
customer = customer_pb2.Customer()
customer.id = 101
customer.name = "山田太郎"
customer.hair_style = "マッシュ"
# 2. シリアライズ(ギュッと圧縮してバイナリにする)
# これが通信で送られる「超コンパクトなデータ」です
binary_data = customer.SerializeToString()
print(f"圧縮後のデータ(バイト): {binary_data}")
# 3. デシリアライズ(元に戻す)
new_customer = customer_pb2.Customer()
new_customer.ParseFromString(binary_data)
print(f"復元した名前: {new_customer.name}")
マイクロサービス
お店の中に「シャンプー担当」「カット担当」「カラー担当」がバラバラにいて、お互いに高速で情報をやり取りしたい時。
スマホアプリ
電波が悪い場所でも、少しでも速くデータを送受信したい時。
gRPC
Protobufをさらに進化させた「超特急の通信システム」を使いたい時。
(チョキ、チョキ……)
はい、お疲れ様でした!スッキリしましたね。 Protobufは、一度ルール(スキーマ)を決めてしまえば、あとはシステムが勝手に効率化してくれる、まさに「職人のための道具」なんです。
もしよろしければ、次は「gRPCという超高速シャンプー台」についても詳しくお話しましょうか?