
MessagePack(メッセージパック)は2008年に古橋貞之氏が公開したオープンソースのバイナリシリアライズ形式で、「Efficient binary serialization format. It lets you exchange data among multiple languages like JSON.」をキャッチコピーに掲げる。JSONと完全に対応する型体系を持ちつつ、表現を密にバイナリ化することで転送量を大幅に削減できる。Redisの内部表現やFluentdの中間ログ形式として広く使われ、日本発OSSの代表格としても知られる。
この記事の目次
- MessagePackのバイナリ表現
- 代表的な利用先と実装の分布
- JSON・CBOR・Protobufとの差異
- 導入時のチェック項目
- まとめ
MessagePackのバイナリ表現

MessagePackは1バイトの先頭タグで型と長さを表現する。例えば0x00〜0x7Fはそのまま正の整数(fixint)、0xA0〜0xBFはfixstr(5ビット長の短い文字列)、0x80〜0x8Fはfixmap(要素数最大15のマップ)といった具合に、頻出パターンが1バイトに収まるよう設計されている。これにより小さなレコードでは50%以上のサイズ削減が見込める。
型体系はnil/bool/int/float/str/bin/array/map/ext(拡張型)で、2013年のspec改訂でbin(バイナリ)とstr(UTF-8文字列)が分離された点が大きい。古い実装ではraw型のまま運用されているケースもあり、互換性に注意が必要だ。Timestamp拡張型(type=-1)が2017年に追加され、ナノ秒精度の日時を標準化された形でやり取りできるようになった。
代表的な利用先と実装の分布

MessagePackの代表的な採用例はFluentd・Fluent Bitのログ転送フォーマットで、ストリーミング処理の中間表現として軽量さが重宝された。Redisも一部のRDB保存形式やクライアントライブラリで利用しており、ゲームサーバの内部RPCにも採用例が多い。AWSのMSK・Kinesis Data Streamsなどに送るペイロードを節約したいケースでも候補に上がる。
公式に近い実装はC・C++・Java・Python(msgpack-python)・Ruby(msgpack-ruby)・Go・C#などほぼ全ての主要言語に揃う。とくにmsgpack-pythonはCythonで実装されており、数十万回/秒の高速エンコード性能を出せる。HTTP API実装では、Content-Typeをapplication/msgpackに切り替えるだけでJSON互換のAPIを高速化できるため、モバイルアプリの帯域節約に有効である。
JSON・CBOR・Protobufとの差異

MessagePackはスキーマレスで自己記述的という点でJSONに似ているが、バイナリ化でサイズと速度を稼ぐ。Protocol BuffersやFlatBuffersはスキーマ駆動で型契約を強制するため設計思想が異なり、JSONとの相互変換が前提のMessagePackとは住み分けがはっきりする。CBOR(後述)はMessagePackから派生したIETF標準で、上位互換的な位置付けにある。
CBORに対してMessagePackの優位点は、実装の歴史が長く、各言語のライブラリの成熟度が高い点だ。一方でCBORはCOSEなどIoTセキュリティ規格との統合が進んでおり、標準化メリットを取りたい場合にはCBORが選ばれる。汎用的にJSONの代替が欲しいだけならMessagePack、規格準拠が必要ならCBOR、と覚えておくと判断しやすい。
導入時のチェック項目

MessagePackを採用する際は、まずstr型とbin型の取り扱いを確認したい。古いmsgpack 1.x系の挙動で書かれたデータを最新ライブラリで読むと文字列がバイト列扱いになる場合があり、APIの境界で混乱を起こす。raw_as_strといった互換オプションを把握しておくと安全だ。
また、Pythonでutf-8以外の文字列を扱うときの注意点として、ensure_ascii相当の考え方がないため、エンコード前の文字列正規化を呼び出し側で行う必要がある。型情報の欠落も注意点で、JSONと同様に「intかfloatか」「Mapのキー順」などは保証されない。スキーマが必要な業務ロジックではjsonschema相当のバリデーションを別途用意することが望ましい。
まとめ
MessagePackはJSONと同じ柔軟さを保ったまま、転送量と速度を1段引き上げる軽量バイナリ形式だ。Fluentd・Redis・モバイルAPIなど現場での実績が豊富で、スキーマレスの自由度を残しつつ性能を底上げしたい用途に最適である。型契約まで欲しい場合はProtobuf、規格準拠が必要ならCBORと使い分けるのがコツだ。
※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

コメント