こう 聞かれます
- 「大きな
ファイルの アップロードを、 どう 作りますか」 - 「数 GB の
動画を 受け付ける とき、 アプリの サーバーで 受けてから 保存する 形で 困る ことは 何ですか」 - 「アップロードの
途中で 回線が 切れたら、 最初から やり直しですか」
面接官が 見ている点
- 大きな
中身を アプリの サーバーに 通すと、 メモリ、 接続、 時間の 上限で 詰まると 分かっているか - 署名付き URL で、
ストレージへ直接送らせる 形を 知っているか - 分けて
送る、 途中から 再開する、といった 切れた ときの 備えを 考えているか - 届いた
ファイルを 信じず、 大きさや 種類を 確かめ、 後の 処理を 分けているか
短い答え
- ファイルの
中身は アプリの サーバーを 通さず、 サーバーが 発行した 期限付きの 署名付き URL を 使って、 ブラウザから オブジェクトストレージへ直接送らせます。 - 大きな
ファイルは 小さな 塊 (チャンク) に 分けて 送り、 切れた ときは 届いていない 塊だけを 送り直せるようにします。 - 届いたら
完了の 知らせを 受けて、 大きさや 種類を 確かめ、 縮小や 変換のような 重い 処理は キューに 入れて別に 回します。
この
少し 詳しい答え
アプリの サーバーで 受けると 何が困るか
アプリの
そこで、
署名付き URL で 直接送らせる
流れは
- ブラウザが
「この ファイルを 送りたい」と、 名前、 大きさ、 種類を アプリの サーバーに伝えます - サーバーは
ログインと 権限を 確かめ、 保存先の 名前を 自分で 決めて、 期限付きの 署名付き URL を返します - ブラウザは
その URL へ、 ファイルの 中身を 直接送ります - 送り
終えたら、 ブラウザかストレージの 通知が、 サーバーに 完了を 知らせます
保存先の
分けて 送り、 途中から再開する
大きな
オブジェクトストレージの
届いた後の処理
届いた
途中で
トレードオフ
直接送らせる
話す例は
よく ある間違い
- 大きな
ファイルも アプリの サーバーで 全部受ける 接続と メモリを 長く 使い、 上限で 切られます。 中身は ストレージへ直接送らせます - 利用者の
ファイル名を そのまま 保存先に使う 上書きや 思わぬ場所への 保存に つながります。 保存先の 名前は サーバーが決めます - 送る
側の 言う 種類と 大きさを信じる 書き換えられます。 届いた 後に サーバーの 側で 中身を 確かめます
深掘りの問い
- 「完了の
知らせが 来なかったら、 どうしますか」 「送信中」のまま 一定の 時間たった 物を 定期的に 調べ、 ストレージに 実物が あれば 完了に 進め、 無ければ 取り消す、と答えます - 「ダウンロードは
どうしますか」 これも 期限付きの 署名付き URL で、 ストレージや CDN から 直接返し、 見て よい 人かは サーバーが URL を 出す前に 確かめる、と答えます - 「同じ
ファイルが 何度も 送られるときは」中身の ハッシュで 同じ物を 見分け、 すでに あれば 送らずに 済ませる 手が ある、と答えます
