Shape SecurityがSuperPackという,スキーマレスの新しいバイナリシリアライズフォーマットをオープンソースとして公開した。
SuperPackでは,ペイロードサイズを削減する目的でバイナリシリアライズフォーマットを使用している。他のスキーマレスフォーマットと比較した場合,ShapeSecurityによると,SuperPackは,特定の4.48KBのサンプルフォーマットでのペイロードが最小である。
オリジナルメッセージ |
YAML |
BSON |
JSON |
Sereal |
SuperPack |
|
非圧縮 |
4.769 B |
134% |
111% |
69% |
40% |
28% |
圧縮 |
4.769 B |
14% |
20% |
12% |
16% |
13% |
YAMLとBSONはメッセージペイロード以外について,かなり冗長である。JSONはYAMLよりはよいのだが,テキストエンコーディング形式であるため,SuperPackよりもかなり大きくなっている。gzip
圧縮後の値はかなり異なり,YAML, JSON, SuperPackはオリジナルメッセージの12~14%で拮抗している。
SuperPackのようなエンコードフォーマットを使用するメリットのひとつは,事前にメッセージスキーマを交換しておかなくても,クライアントとの通信が可能なことだ。データタイプ情報はペイロードに含まれている。SuperPackには,一般的なtrue, false, uint16, uint32, float32
に加えて,それ程一般的ではない uint6, nint4, array5
を含む36のデータタイプが前もって定義されている。後者はメッセージで使用される確率の高い値を表現するためのものだ。
配列や文字列,マップも含まれている。タイプのひとつであるextension
では,ユーザが新たなタイプを追加することができる。SuperPackには,繰り返し文字列と繰り返しキーセットの2つの最適化がオプションとして用意されており,特定ケースでのペイロードの削減が可能になっている。
我々は同社の研究員でFOSSコーディネータのMichael Ficarra氏から,SuperPackについて詳細を聞くことにした。
InfoQ: 他のスキーマレスフォーマットよりもエンコードサイズを小さくするために,具体的にはどのようなことが行われているのでしょう?
Michael Ficarra: SuperPackの前提にあるのは,事前にデータのスキーマを予想できない場合でも,データには何度も繰り返される構造や値が存在する可能性が高い,という思想です。例として,買い主と猫をマップする“cats”というデータ構造があるとします。すべての猫の情報をエンコードしなくても,名前や誕生日,好きな食べ物といった情報があるという事実から,この情報を一度エンコードすれば,それを参照することで,protobuff形式の値のパッキングを極めて効率的に行なうことができます。
さらに,他に比べて頻度の高い値については,効率的な表現を行なう必要があります。フォーマットを詳細に見て頂けば,すべての値が,私たちが”タイプタグ”と呼んでいる1バイトのインジケータから始まっていることが分かります。このタイプタグには,すべての値あるいは一部の値を,その中に直接エンコードできるような領域が確保されています。単純な例はbooleanタイプタグで,1つの値は真であり,もうひとつは偽です。同じように”uint6”には64のタイプタグがあって,0から63までの値を1バイトで表現することができます。また,エントリ数が32未満の配列(長さとエントリをエンコードする必要がある)は,長さをタグ内にエンコードすることができます。先程の例に戻ると,猫のひげ(whisker)は普通64本未満ですし,大部分の買い主が飼う猫の数は32匹未満ですから,これらの値は効率的にエンコードできます。
InfoQ: Protocol Buffersなど他のスキーマ駆動のバイナリフォーマットとの比較は行なっていますか?Protobufのペイロードはかなり小さいのでしょうか?
Ficarra: そのような比較はしていません。SuperPackの文字列の重複排除機能が特に有効な場合を除けば,ほとんどの場合,Protobufの方が小さいだろうと思います。スキーマ駆動フォーマットが使用可能なニーズについては,特にLZWやDeflateのようなロスレスデータ圧縮アルゴリズムが併用可能であれば,そのメリットを活用した方がよいでしょう。
InfoQ: メッセージのエンコード/デコードに必要な処理時間という面ではどうでしょう?
Ficarra: エンコード時間は,キーセットあるいは文字列の重複を除外する最適化が選択(あるいは指定)されたかどうかによって異なります。すべての数値にIEEE 754倍精度数を使用するJavaScriptのように,実装言語に起因するパフォーマンス上の問題もあります。
InfoQ: 他の言語のサポートを追加する予定はありますか?
Ficarra: もちろんです!Javaの実装は,Shape Security社内で使用しています。オープンソースとして公開する準備はまだできていませんが,ニーズはあると聞いているので,そのプロセスを進めています。それ以外のエコシステムに着手したいコミュニティがあれば,私たちは喜んでお手伝いします。Rustの実装などは面白そうですね!
SuperPackはまだ非常に若い,ということも付け加えておきたいと思います。向上を実現できる提案があれば,ぜひお聞きしたいと思っています。まずは仕様のイシュートラッカのイシューをオープンしてください。SuperPackの将来のバージョンが,さらによいものになればと願っています!
現在のSuperPackにはJavaScriptトランスコーダが付属しているが,これを起点として他のものを開発することができる。SuperPackは非常に寛容なライセンス下で,オープンソースとして公開されている。
この記事を評価
- 編集者評
- 編集長アクション