レポート

Socket.IOの作者Guillermo Rauch氏,新開発のファイルアップロードライブラリ「Party」を紹介 ~ 東京Node学園祭2014 基調講演

この記事を読むのに必要な時間:およそ 2.5 分

また,Partyではファイルを分割してそれぞれ異なるTCPコネクションでアップロードしたり,圧縮を使うことで高速化もしています。デモにおいても通常のファイルのアップロードの半分の時間でアップロードができることを示しました。並列にTCPコネクションを使ってアップロードすることで,それぞれのスライディングウィンドウを大きくでき,スループットを最大化できるそうです。また,圧縮という点でも現在Google Chromeのみで使えるWebsocketのDeflateを使ったり,asm.jsで作成したzlib.jsを使うことで高速化していますが,この部分はPartyがハンドリングしているので開発者はこれらを気にすることなく開発できます。

ファイルを分割することによるメリットは,信頼性を高めることにもつながっています。従来の方法では,ファイルの90%がアップロードされた時点でブラウザがリフレッシュされると,また最初からアップロードするしかありませんでした。しかし,Partyを使えばその続きからアップロードすることができ,サーバに送れていない部分だけをアップロードすることが可能となります。これにより,ネットワークの環境がよくないブラウザでも,安定してファイルのアップロードができるようになります。

さらに,Partyでは開発者が自由に使えるようにポーズやレジューム機能も提供しています。これらが実現できているのは,File APIを使ってファイルのユニークな識別子ETagを作ることができているからです。ファイルの変更時間,名前,ファイルサイズなどを用いてユニークな識別子を作成できます。もし必要であれば,ファイルのバイナリデータを用いてCRC32やMD5のような高度なハッシュメカニズムも使用できます。

これらはデフォルトでHTML5のWorkerを使うことでノンブロッキングに実行されます。ファイルの分割,同期,リトライなどはすべて独立したWorkerの中で動作します。また,認証や設定などもフレキシブルに行えるようになっており,ミドルウェアのような機能を提供します。サーバがクライアントに転送可能な最大サイズや,チャンクのサイズ,チャンクが送られてこない時にファイルを破棄するまでの時間などが設定可能です。ユーザ認証も好きなものを使えます。

現在はAutomatticの新しい商品のために開発中で,もうすぐGitHub上でオープンソースになる予定です。

質疑応答

Q. File APIなどの新しいAPIを使う時に仕様が固まっていませんが動作が不安定だったり,不安になったり,もう少しこうだったらいいのに,と思うことはありますか?

A. File APIに関しては仕様も固まっており,XHRと組み合わせて使っています。現在気になっているのは,Stream APIの仕様がまだ固まっていないことです。Streamのシミュレートを試しましたが,パフォーマンスの面であまりよくありませんでした。Stream APIはまだまだ改善していく必要があります。

Q. iOSやAndroidのモバイルブラウザでも使えますか?

A. モバイルブラウザ対応は素晴らしいです。ただ,モバイル向けブラウザのボトルネックはメモリアロケーションの部分と,アップロードを同期的に行う必要がある点です。そのため複数ファイル選択を一部機種で行わないようにしてWebViewがクラッシュするのを防いだり,並列数に制限をつけるなどの最適化をしています。その甲斐あってか,すべてのAPIがテストした多くの機種でよく動いています。

まとめ

Partyは,Webサービスを作る上でファイルアップロード機能をより簡易に導入できるJavaScriptのライブラリです。開発の際にボトルネックになりがちな並列アップロードや圧縮を解決し,ポーズ・リジューム機能を実現します。現在,Guillermo Rauch氏を中心に開発が進められており,近日AutomatticのGitHub上にてオープンソースとして公開される予定です。デモで感嘆の声が上がるなど,大盛況の基調講演でした。

著者プロフィール

小林貴也(こばやしたかや)

福井工業高等専門学校を卒業後いろいろあって株式会社サイバーエージェントへ入社。JavaScriptを書いたりRailsを書いたりしている。映画をみたりDJをしたりゲームをするのが趣味。

Webサイト:http://jgs.me
Twitter:@neo6120