「ご注文ありがとうございました」って出たから、確認メールはもう送られてるはずだよね?
その時点では、まだ列に並んでいるだけかもしれないよ。
ECサイトで「注文を確定する」を押すと、画面にはすぐお礼の表示が出ます。でもその時点で、確認メールはまだ送られていないことがあります。メールの送信や在庫の更新は、画面の表示に間に合わせる必要がないので、いったん「あとでやる仕事」の列に並べておき、裏側のサーバーが空いたときに順番に片づけています。この列がキューです。
チケット売り場の行列に似ています。来た順に並び、窓口が空いたら先頭から対応する。窓口が混んでいても、列に並んでいればいずれ順番が来ます。
すぐ終わらなくていい仕事は列に回す
キューは、処理の依頼を一列に並べて、処理する側が空いたタイミングで順番にこなしていく仕組みです。依頼が来た瞬間に全部を片づけようとしないので、画面はすぐに返事ができ、重い処理も少しずつ確実にこなせます。アクセスが一気に押し寄せても、列が伸びるだけでサーバーは自分のペースで処理できるため、瞬間的な負荷の波をならせます。
向いているのは、たとえば次のような仕事です。
- 注文後の確認メールを、大量に送る
- 画像や動画のアップロード後に、縮小版(サムネイル)を作る
- 外部サービスへの通知を、失敗しても送り直せる形で送る
決まった時刻に動く cron と違い、キューには依頼が来たタイミングで積まれていきます。出来事を相手に直接知らせる Webhook と比べると、一度列に積んでから処理するので、通信に失敗したときの送り直しがしやすくなります。処理する側をサーバーレスで動かし、列に依頼が積まれるたびに起動させる構成もよく使われます。
列は黙って詰まる
列に積んだ仕事は「いつか必ず終わる」と思われがちです。でも実際には、処理する側が止まっていたり、同じ依頼が失敗し続けていたりして、列が延々と伸びていることがあります。画面は普通に「ありがとうございました」と出ているので、誰も気づきません。
列の長さと失敗の件数を監視して、詰まっていたら気づけるようにしておきます。失敗した依頼を何回まで送り直し、どこで諦めるかの上限も決めておきます。
送り直しをするなら、同じ依頼が2回処理されても困らない作りにしておくことも大切です。確認メールが2通届く程度ならまだしも、決済が2回走っては困ります。依頼の順番が入れ替わってもよいのか、順番を守る必要があるのかも、使う前に確かめておきましょう。