効率的なバイナリシリアライズに MessagePack を使う
MessagePack は JSON ライクなデータをコンパクトなバイナリ形式にパックし、サイズとパース時間を削減します。高性能 API や IoT で人気です。
- 1
MessagePack はバイナリシリアライズ形式で、JSON ライクなデータをより少ないバイト数で表現します。タイプ・長さ・値 (TLV) 方式のエンコードを使い、小さな整数は 1 バイト、短い文字列は 1-2 バイトに収まり、区切り文字や引用符もありません。テキストパースを回避するため、JSON よりエンコード/デコードが高速です。
- 2 Base64 エンコーダー →
MessagePack のバイナリ出力を base64 にエンコードして、テキストチャネル経由で転送できるようにします。MessagePack は生バイト列を出力するため、base64 にすると JSON フィールド、HTTP ヘッダー、ログに安全に格納できます。受信側は逆に、base64 デコード → MessagePack アンパックを行います。
- 3 HEX エンコーダー →
デバッグ用には hex エンコードも使えます。hex は人間が読める形式で、MessagePack のバイト構造を調べられます。各バイトがタイプと値のエンコードを示します。これはプロトコルのデバッグ用であり、本番の転送には使わないでください (hex は base64 の約 2 倍のサイズになります)。
- 4
MessagePack の用途:マイクロサービス間の内部通信 (protobuf スキーマなしで gRPC 並みの効率)、IoT (小さなペイロード)、キャッシュ (より小さい Redis 値) です。公開 API では、コンテンツネゴシエーション付きの JSON を使い、application/json と application/x-msgpack の両方をサポートしてください。
よくある質問
- MessagePack と Protobuf はどう違いますか?
- Protobuf はスキーマ (.proto ファイル) を必須とし、コードを生成します。より小さく高速ですが、柔軟性は低くなります。MessagePack は JSON と同じくスキーマレスで、使いやすい一方ややサイズが大きくなります。安定した大流量の内部 API には Protobuf を、柔軟性が必要な場合やスキーマが頻繁に変わる場合は MessagePack を使ってください。
- ブラウザーで MessagePack を使えますか?
- はい。@msgpack/msgpack などのライブラリが高速なエンコード/デコードを提供しています。HTTP ではコンテンツネゴシエーションを使い、Accept: application/x-msgpack を送信してバイナリレスポンスをデコードします。WebSocket では ArrayBuffer を直接送受信します。