こう 聞かれます
- 「数分から
数時間かかる 処理を、 どう 動かしますか」 - 「何万件もの
メールの 送信や、 大きな ファイルの 変換を、 API の 中で そのまま 動かして よいですか」 - 「途中で
落ちたら、 最初から やり直しですか」
面接官が 見ている点
- 要求を
受けた 処理の 中で 待た せず、 裏に 回すと言えるか - 落ちた
ときに 途中から 再開でき、 2 回動いても 壊れない 作りを 考えているか - 実行環境ごとの
時間の 上限を 知っていて、 置き場を選べるか
短い答え
- 利用者の
要求からは 切り離し、 キューに 仕事を 積んで、 裏の 担当が 小さな 単位ずつ 処理します。 - 手順が
長い物は、 どこまで 進んだかを 記録する 仕組みに 乗せ、 落ちても 続きから 再開できるようにします。 - 1 つの
単位が それでも 重い ときは、 その 部分だけ長く 動ける 専用の 実行環境に 逃が します。 そのぶん仕組みが 増え、 全体の 流れは 追いにくくなります。
少し 詳しい答え
キューで 細かく分ける
キューは、
小さく
何回やり直しても
手順を 記録して 途中から再開する
「データを
キューでも
重い所だけ逃が す (トレードオフ)
1 つの
分ける
話すときは、
よく ある間違い
- API の
中で 終わるまで待たせる 利用者を 待たせるうえ、 途中で 接続が 切れると 処理も 止まります。 受け付けたら すぐ 返し、 裏で 動かします - やり直しで 2 回動く
ことを考えない 同じ メールが 2 通届く、 同じ 金額が 2 回足される、が 起きます。 冪等な 作りにします - 失敗した
仕事を 無限に回すいつまでも 同じ 失敗を 繰り返して、 ほかの 仕事を 詰まらせます。 回数を 決めて デッドレターキューに移します
深掘りの問い
- 「進み具合を
利用者に 見せるには」仕事に 番号を 付けて 状態を DB に 書き、 画面は その 状態を 読みに 行く、と答えます - 「キューの
担当を 増やすと、 何が 困りますか」 書き込み先の DB や、 外の API の 回数制限に まとめて 当たるので、 担当の 数の 上限を 決める、と答えます - 「順番が
大事な 仕事は どうしますか」 同じ 利用者の 仕事は 同じ 列に 入れる、 または 順番の 番号を 持たせて 追い 越しを 捨てる、と答えます