テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

sprayからakka-httpへのマイグレーション

私は, 今回のフリーランスでfilesystem-backedなS3ストレージを作った. これは理論的には, 共有ストレージの上にも適用可能であり, nfsではすでにテスト済である. このソフトウェアは, これまでブログで色々と調査内容を共有してきたとおり, sprayの上に構築されている. 確実に動作させるものを作る, ドキュメントが揃っているなどの点からすると, sprayを選択したことは正しかったと考えるが, 将来的にはakka-httpへの移行をすべきということはわかっている.

このソフトウェアの狙いは, シンプルな環境で動作する完全なS3 APIセットを提供することであって, スケールする土台は, 下の分散ファイルシステムに委ねるという方針をとっている. 従ってRiakCSやCephなどは直接の競合とはいえない. むしろ競合としてふさわしいのは, minio/minio · GitHubである. Minioは, MinimumはObject Storageを提供するプロジェクトであり, minioはfilesystem-backedに特化したものである. minioはrestrictedなAPIセットを提供することを信条としているからこの点では違うと言えるが, 現存するソフトウェアの中でもっとも近いのはminioである. 彼らは別にminio-xlというものを作る予定であり, これは, Donutと呼ばれるErasure-Codingを応用した分散ストレージをbacking storeとしており, こちらが本丸である. 彼らの狙いはMinioという思想そのものを広めることにあるから, filesystem-backedなMinioを開発しているのだ.

私の目標はminioを倒すことではなく, device-mapperのように, stackingによって巨大なS3ストレージを作るというソフトウェア的な楽しみを純粋に得ることにある. あなたはまだ"Just for fun"という言葉を思い出せるだろうか?

さて, s3fsは, S3をバックエンドとして, filesystemを提供するものである. 従って, これを私のものと組み合わせると, S3 -> FS -> S3という変換が可能になる.

s3fs-fuse/s3fs-fuse · GitHub

さらに, 私の調査では, s3fsは極めてprimitiveなS3 APIしか要求しない. (https://github.com/s3fs-fuse/s3fs-fuse/issues/262) 従って, この変換は, 最小APIのS3 -> FS -> フルAPIのS3となる. これはすなわち, 最小の実装努力によってフルセットのAPIを得られることを意味する. オーバーヘッドが積み重なるので, これが実用的に意味があるとはあまり思わないのだが, ソフトウェアとしては面白い. プログラミングでいうと, mix-inに相当する.

これによりどうなるかというと, 最小限のAPIをサポートするだけでよい堅牢かつ高性能な分散ストアを実装し, その上に枯れた変換層を積み重ねるだけで分散S3ストレージを作れてしまうことになる. もし, 楽しみの他に純粋な狙いがあるとすればここである. 技術的に可能かどうかであるが, 多くの分散ストレージは設計的に, 内部的な構造とAPIの層が分離しているのだから, それがS3とかFilesystemというレベルに持ち上がって疎結合になってしまう分不利ではあるが, 不可能ではないと今のところ考えている. それに, もし不可能だと分かったとしても, 少なくともminioとの競争は続けることが出来る. 私は, 彼らと同等の理由から, また実際にそういうものを求められたという経緯から, 小さなS3ストレージには一定の需要があると考えているのでプロジェクトは続ける覚悟がある.

ここで突然のGood News. フリーランス先の多大な好意により, 契約終了後, akka-httpへの移行を条件に, OSSとして公開出来ることとなった. 楽しみにしてほしい.

しかし道のりは平坦ではないことがわかっている. S3 APIはかなり複雑であり, 私のソフトウェアは, sprayの初歩的なチュートリアルを遥かに超越している. はっきり言って, S3は悪魔だ. 人類がS3 APIを理解し実装するのは私で最後にしたいという思いがある.

特に低層で用いるモデルでは, かなりドラスティックなチェンジがあることを確認している. このモデルについては, 別稿で詳しく説明しようと思う.

HTTP Model — Akka Documentation

akka-httpでは, sprayではchunkless-streamingという設定でカバーしていた部分を, CloseDelimitedという型で明示している. 実はこれは, S3のことを考えると, 少し頭が痛い.

このプロジェクトは少なくとも1年は続くだろう. ライトブーストに続く長期プロジェクトに巡りあうことが出来て, 幸せだ. 名前はどうしようかな.