レポート

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

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

2014年11月15日,株式会社 サイバーエージェントセミナールームにて東京Node学園祭2014が開催されました。本稿では基調講演の模様をレポートします。

画像

基調講演はNode.jsのリアルタイム通信モジュールであるSocket.IOの作者であり,CloudUpというサービスを開発しているAutomatticのCTO,Guillermo Rauch@rauchg氏です。もうすぐ公開されるOSSのファイルアップロードツール「Party」の話を中心に,いまWebに不足している「ファイルアップロード」について話しました。

画像

拡がるSocket.IOの実用例

日本のたくさんの会社が何年にも渡ってSocket.IOにパッチを送ってくれています。まずあまり知られていない大切なマイルストーンについて共有しました。

Socket.IOが使われている例としてOffice.comがあります。Office OnlineやOffice 365でもSocket.IOでリアルタイムに編集やチャットができるようになりました。また,クラウドカスタマーサービスのZenDeskでもSocket.IOが使われています。

最近みた面白い例としては,いわゆるIoT(Internet of Things)を挙げていました。OpenROVというDIYでできる小型潜水艦で,ブラウザからこの潜水艦を操作するためにSocket.IOが用いられています。

ファイルアップロードの問題

ファイルアップロードは,現在のWebでも難しい問題のひとつです。その原因は,そもそもHTTPがファイルを転送するためのものとして設計されてないためです。HTTP 0.9ではこのように定義されています。

The response to a simple GET request in hypertext mark-up language(レスポンスは,シンプルなGETリクエストに対してマークアップで書かれたハイパーテキストである)

ここでは,HTTPはASCII文字のバイトストリームというように書かれています。また,HTTPの名前をとってみても「Hyper "Text" Transfer Protocol」であるように,テキストの転送をするためのものとして設計されているのです。

今ではあまり使われていないFTPというプロトコルはそのためにあります。なんといっても「File Transfer Protocol」なのですから。しかし,たくさんの欠点があるためあまり使われていないのが現状です。例えば,FTPでは特別なTCPコネクションを必要とし,FTPを使う際には2つのTCPコネクションが必要となります。また,ファイルの転送という点でも,圧縮できるのはテキストだけでバイナリデータについては圧縮が適用できません。さらに,セキュリティの面でも問題があるためどんどん使われなくなっています。

FTPをWeb上で使うにはさらに問題があります。ファイルダウンロードのために同じTCPコネクションをHTTP,FTPで共有できないため,多くのオーバーヘッドがあるからです。一方で,HTTPは機能が追加されMultipart Uploadが可能になり,バイナリデータのアップロードが可能になりました。また,ASCII文字以外のデータのダウンロードも可能になりました。ただ,Web上でのファイルアップロードに関しては,今でも簡単になったりより良くなったりはしていません。

ファイルアップロードに確実に足りてない機能は「ポーズ・レジューム」機能です。加えて,自動リトライの機能もないので,アップロードが失敗した時のエラーハンドリングについても自分で行う必要があります。チャンクに分割する機能も不足しているので,並列でアップロードもできなければ,圧縮もできません。これらはアップロードの速度がとても遅かった時はあまり問題ではありませんでしたが,アップロードの速度が速くなった現在では問題になっています。また,ダウンロードでは圧縮ができますがアップロードではできません。

JavaScriptによる解決

「今日は今考えている解決法を紹介したいと思っています。その方法は,皆さんがよく知っているJavaScriptを使う方法です」と,現在Guillermo Rauch氏が開発している「Party」というライブラリを紹介しました。

ベースとして使う機能はXMLHttpRequest2(XHR2)です。プログレスイベントを使って,クライアントがTCPコネクションでの進捗を取得できますし,バイナリサポートもあります。そしてFile APIのBlob#sliceなどを使うことで実際にアップロードする前にファイルのバイナリデータを操作できます。Partyではその2つのAPIを使って,ファイルのアップデートをより簡単に強力に行えるようにします。

今までのWebサービスの作り方では,大きなフレームワークの中で,アップロード用のルーティングを設定したり,アップロードのためのモジュールを追加したりすることが一般的でした。しかし,Partyでは1つの専用のアップロードサービスとなるように作っています。

この新しいシステムはHTTPを使ったファイルストリームというよりはBitTorrentとよく似た仕組みのシステムになっています。

1つの独立したサービスにすることによるメリットは2つあります。ひとつはセットアップ時にクライアントサイドのJavaScriptと別に扱えることです。もうひとつは,CDNでの配信を簡易化できることです。

これらについて,デモサイトを使ったデモがありました。サーバ側ではSocket.IOのようにパスを設定するだけでアップロードサービスが提供できるようになります。アップロードされたファイルをストリームで扱えたり,メタデータを追加することもできます。クライアント側ではblob, array buffer, file referenceのいずれのデータもバイナリ構造のデータとして扱うことができ,XHRとは異なりアップロードの進捗や失敗を通知することができます。

画像

サーバ側のコード

画像

クライアント側のコード

画像

著者プロフィール

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

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

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

コメント

コメントの記入