[Scala] Unfilteredで簡単ストリーミングダウンロード

本記事では、Scala製のUnfilteredと呼ばれるフレームワーク(後述)を使用し、簡単にファイルをストリーミングダウンロードする方法を紹介します。


Unfilteredとは?

ここでの詳しい説明はしませんが、簡単に説明するとUnfilteredは、Scalaのパターンマッチの機能を使用し、HTTPリクエストを処理するフレームワークです。

詳しい説明は、公式ドキュメントにサンプルとともに記載されてあります。

ResponseBytes

まずUnfilteredには、ResponseBytesと呼ばれるクラスが用意されており、そちらを利用することによりByteデータを簡単に返却することが可能となっています。

しかしながら、ResponseBytesを使った実装では、以下の様な問題が出てきます。

  • ダウンロード対象が大きいファイルの場合、データをArray[Byte]に溜め込んでしまうため、ダウンロード可能なファイルサイズがヒープ容量に依存。
  • ダウンロード時も全てファイルデータを読み込んだ後にファイルダウンロード開始されるため、開始されるまで止まっているように見える。


Channel(Netty)

そこで、NettyのChannelを使い、ストリーミングすることでResponseBytesで起きた問題を解決することが可能となります。

ここで注意すべき点としては、非同期処理を行うため、Planをasync.Planにする必要があります。

以上でストリーミングダウンロードが可能となりますが、Unfilteredフレームワークに限らず、ファイルダウンロードAPIを作成する際は、Channelなどを用いた非同期な実装を検討してみてはいかがでしょうか。

Author
Satoru Takaishi

Leave a Reply

Popular Posts