八発白中

技術ブログ、改め雑記

Day 17: smart-buffer

これは fukamachi products advent calendar 2016 の17日目の記事です。

今日はsmart-bufferについて話します。裏側で使っているライブラリなのでたぶん知らない人がほとんどかと思うので紹介です。

Wooの成功

15日目に話したWooは想像以上に受け入れられ、すぐに実際に使ってみようという人が多く見られました。そしていくつか質問も飛んできます。

よくあった質問がこれでした。「ファイルアップロードしたときにファイルが全部メモリに載ってるよね?大きいファイルアップロードしたらやばくない?」

twitter.com

大きなリクエストの保持方法

もちろん、全部メモリに載せてたら問題です。Wooではこの問題に対してスマートな方法で対処しています。

リクエスト本文を読み込んでいき、サイズが小さいうちはインメモリバッファにロードします。もしサイズがしきい値を超えたらバッファの内容をファイルに書き込み、ファイルバッファに切り替えます。

つまり、小さいリクエストのときはインメモリで高速に処理し、大きいリクエストはファイルに書き出してメモリ使用を抑えます。

twitter.com

元々fast-httpのmultipartパーサーの機能だったのですが、これは汎用的に使えるな、と思ってのちに別ライブラリにしました。それが「smart-buffer」です。

smart-bufferのアイデア

このアイデアは僕のオリジナルではありません。

Pythonmultipartというmultipart/form-dataのパーサーライブラリがあります。これが全く同じ仕組みで動作し、小さいファイルアップロードにはメモリで、大きいファイルアップロードにはディスクで対応しています。

おわりに

smart-bufferはGitHubで公開されており、Starは7です。使っているライブラリはfast-httpとWooだけですね。

明日のアドベントカレンダーは18日目のtrivial-signalについてです。お楽しみに。