こう 聞かれます
- 「isolate 型の
サーバーレスと コンテナは、 何が 違いますか」 - 「isolate 型の
立ち 上がりが 速いのは なぜですか」 - 「速いなら、
全部 isolate 型で 作れば よいのではないですか」 (裏から聞く形)
面接官が 見ている点
- 速い
理由を、 何を 立ち上げずに 済むかで 説明できるか - 使える API、
CPU の 時間、 メモリなどの 制約を 知っているか - 処理の
重さや 必要な 道具で、 どちらを 選ぶか 決められるか
短い答え
- isolate 型は、
1 つの JavaScript の 実行環境の 中に、 小さく 区切った 部屋 (isolate) を 作って 動かすので、 OS や コンテナを 立ち上げずに 済み、 立ち 上がりが 速いです。 - そのかわり、
Node.js の API は 一部だけ 使える、 CPU の 時間や メモリに 上限が ある、 などの 制約が あります。 - 短く
軽い 処理を 世界中の 近い 場所で 返すなら isolate 型、 重い 計算や 好きな ライブラリや バイナリが 要るなら コンテナを 選びます。
少し 詳しい答え
何を 立ち上げずに済むか
コンテナは、
isolate 型は、
isolate 型の
そのかわりの制約
- 使える API Node.js の API は
互換の 設定で 一部を 使えますが、 全部では ありません。 ファイルを 読み 書きする 前提の ライブラリや、 OS に 頼る バイナリは 動かない ことがあります - CPU の
時間とメモリ 1 回の 要求で 使える CPU の 時間や メモリに 上限が あります。 値は プランや 設定で 変わります - 状態を持たない isolate は
いつ 終わるか 分からず、 次の 要求が 同じ isolate に 来るとも 限りません。 逆に、 同じ isolate が 続けて 別の 利用者の 要求を 受ける ことも あり、 グローバルな 変数の 値は そのまま 残ります。 要求ごとの 値を グローバルに 置くと、 ほかの 利用者に 漏れたり古い値を 使ったりするので、 続けて 使う値は 外の 置き場に出します
どちらを 選ぶか (トレードオフ)
isolate 型が
コンテナが
両方を
よく ある間違い
- 「isolate 型では Node.js が
使えない」と言う Node.js の API は 一部だけ 使える、 が正しい 言い方です。 使いたい ライブラリが 動くかを 確かめます - グローバルな
変数に 利用者の 状態を置く 次の 要求が 同じ isolate に 来るとは 限らず、 逆に 別の 利用者の 要求が 同じ isolate に 来て、 前の 値を 読んでしまうこともあります。 状態は 外の 置き場に出します - 速さだけで
全部を寄せる 重い 処理を 入れると、 CPU の 時間の 上限に 当たります。 処理の 重さで 置き場を分けます
深掘りの問い
- 「コンテナの
コールドスタートは、 どう 抑えますか」 最小の 台数を 置く、 イメージを 小さく する、 起動時の 処理を 減らす、と 答え、 最小の 台数には 使っていなくても 費用が かかる、と添えます - 「isolate 型で
データベースに つなぐ とき、 何に 気を つけますか」 要求の たびに 接続を 作ると DB の 接続数が あふれるので、 接続を まとめる 中継や HTTP で 話せる DB を 使う、と答えます - 「同じ
処理を 両方で 動かしたら、 何を 比べますか」 応答の 遅さ、 費用、 使える ライブラリ、 運用の 手間を、 同じ 負荷で 測って 比べる、と答えます