何か着ていればいいよ

ソフトウェア技術者の日常や技術の話を書こうと思います。

Webアプリケーションやらかし集(その1)

Webアプリケーションの開発に関連していままで見たことあるやつや、やってしまったことがあるやらかし集。
アンチパターンと言っても良いと思う…。

というわけで、尊敬すべき愛読書"SQLアンチパターン"の記法に沿って解説していみます。

SQLアンチパターン

SQLアンチパターン

SQLアンチパターンでは対象のアンチパターンを以下の項目に分けて詳述しています。

[やらかし] upload, download 時にサーバーサイドのファイルシステム上にファイルを保存

本家アンチパターンのようにイカした名前がつけられない・・・。

目的

Webアプリケーションでファイルのアップロード処理やダウンロード処理を実装する

アンチパターン

upload, download 時にサーバーサイドのファイルシステム上に一旦ファイルを保存し、その後処理を継続する。
たとえばアップロード時ならば、アップロードファイルを一旦ファイルとして保存してからそのファイルをDBに格納する。
ダウンロードの場合はDBから取得したファイルを一旦ファイルに保存してからダウンロード処理に渡す。

アンチパターンの見つけ方

Webサーバーを運用続けて停止開始を繰り返すと特定のディレクトリにゴミがたまるという苦情を受ける。
あるいは、時々アップロードやダウンロードに失敗するという不具合報告を受ける。

アンチパターンを用いても良い場合

このアンチパターンを用いても良い場合が果たしてあるのか?よっぽど限定的な場面や要件だと思う・・・。*1

解決策

個人的にはメモリ上からstreamで返すような形が良いのではないかと思うのだけど、よく見かけるこのパターン
いくつか問題がある上にメリットらしいメリットがほとんど思い浮かばない。*2
ちなみに自分に思い浮かぶ問題点

  1. ディスクIOが挟まるのでレイテンシに負のインパクトがある
  2. ディレクトリ構成とファイル名のつけ方次第だがファイルがかぶる可能性がある
  3. Webサーバーの停止タイミングによってはサーバー上にゴミが残る上、それがゴミかどうか認識すしづらい。

うーん。 でも、同じ人が何度もやるとかそういうわけではなく時期も場所も人も異なる幾つかの現場で見たことがあるんだな…。
もしかして人は通常この実装をやりたくなるなんか心理的な要因があったりするのかも…。
真面目に考えるとクラサバ系からWebアプリ作るようになって日が浅い不慣れなひとがやりがちなパターンなのかなぁ?

*1:単純に自分には分からない。想像力不足。

*2:あるなら教えて欲しい。少なくとも以前こういう実装をしていた当人たちからは特段メリットを聞き出せなかったし、自分には分からない。