Islands in the byte stream

Technical notes by a software engineer

GraphQLとMessagePackは相性がよさそう

MessagePackはJSONのようなデータをシリアライズできるbinary formatで、JavaScript実装である msgpack-javascriptを基準で考えると次のような特徴があります:

  • JSONよりencodeもdecodeも少し速い
    • かつ、streaming decodeができるので fetch() のresponseのdecodeの効率がとてもよい
    • とはいえ実用上は「JSONより遅くない」ということのほうが重要ではある
  • binaryを直接扱える
    • これに対してJSONでbinaryを扱うときははbase64などでエンコードする必要がある
  • timestamp型があり、デフォルトではJSのDateにマッピングされる
    • Intl.DateTimeFormatへの入力としてならこれで必要十分
    • マッピングをあとから変えることはできる

特にバイナリを直接扱えるのはJSONとくらべて非常にすぐれた点で、たとえばGraphQL APIを実装するときはファイルのアップロードの扱いに常に悩まされるわけですが、MessagePackを使えばオーバーヘッドなしにバイナリを扱えます。

あとは現在は手元にコードは一切ないのですが、GraphQL schemaを読みながら適切にGraphQLのcustom scalar typeを適切なオブジェクトにマッピングするMessagePack decoderがあるとさらに捗りそうです。

MessagePackを単なるJSONの代替として考えるとJavaScript的にはメリットに乏しいのですが、JSONよりも表現が豊富で拡張性にすぐれたシリアライズフォーマットと捉えるとGraphQLと相性がいいなあ…ということを考えています。というわけで最近MessagePack for JavaScriptの実装を頑張っているのでした。まずは優れた実装がないと話になりませんからね。