こう 聞かれます
- 「同期処理と
非同期処理 (キュー、 イベント) を、 どう 使い 分けますか」 - 「会員登録の
あとに 歓迎の メールを 送ります。 登録の 処理の 中で 送りますか」 - 「キューに
入れた 仕事が 失敗したら、 どうしますか」
面接官が 見ている点
- 技術の
好みではなく、 利用者の 待ち時間と、 ビジネスで 落としてはいけない 処理の 両方から 決められるか - 非同期に
すると 増える 心配 (失敗、 二重の 実行、 順番) を 知っているか - 再試行、
冪等性、 デッドレターキューを セットで語れるか
短い答え
- 利用者が
その場で 結果を 待つ処理は 同期に、 メールの 送信、 画像の 処理、 外部の サービスとの 連携は 非同期にします。 - 時間の
かかる 処理や、 相手の 都合で 失敗する 処理を 同期で 待つと、 画面が 遅くなり、 相手の 障害が こちらの 障害に なるからです。 - 非同期に
するなら、 再試行、 何度 実行しても 結果が 同じに なる 作り (冪等性)、 失敗した ジョブの 退避を セットで 作ります。
少し 詳しい答え
分け方
- 同期ログイン、
残高の 表示、 注文の 確定のように、 結果を 見ないと 次に 進めない処理 - 非同期歓迎の
メール、 画像の 縮小、 外部の 会計サービスへの 連携のように、 少し 遅れても よく、 時間が かかったり 失敗したりしやすい処理
非同期では、
登録の API
→ 利用者を保存
→ 「メールを送る」を列へ
→ すぐ「登録しました」と返す
ワーカー
→ 列から取り出して送るセットで 作る 3 つ
- 再試行外部の
サービスは 一時的に 失敗します。 間を あけて 何回か 試し直します - 冪等性再試行や
キューの 都合で、 同じ 仕事が 2 回届く ことがあります。 仕事ごとに 番号を 付け、 済んだ 番号は 飛ばすように して、 メールが 2 通届かないようにします - デッドレターキュー何回試しても
失敗する 仕事は、 別の 列に 退避します。 そこに 溜まったら 知らせが 届くようにし、 人が 原因を 見て 直してから 流し直します
トレードオフ
非同期に
よく ある間違い
- 何でも
非同期にする 動く 物が 増え、 不具合を 追うのが 難しくなります - 再試行だけ付けて
冪等性を考えない 同じ メールや 同じ 請求が 2 回出る ことがあります - 失敗した
仕事を捨てる 何が 落ちたか 分から なくなります。 退避して、 知らせが 届くようにします
深掘りの問い
- 「仕事の
順番が 大事なときは」 同じ 利用者や 同じ 注文の 仕事だけは 順に 処理される よう、 まとまり ごとに 並べる、と答えます - 「利用者に
終わった ことを どう 伝えますか」 状態を 保存して おき、 画面から 定期的に 確かめるか、 終わったら 通知を 送る、と答えます - 「再試行の間隔は」回を
重ねる ごとに 間を 広げ、 相手が 回復する 時間を 作る、と答えます