【めっせーじきゅー】

メッセージキュー とは?

最終更新:
💡 システム間の「伝言板」で非同期に連携

システム間でメッセージを非同期にやり取りするための仕組み。送信側と受信側を切り離し、処理の負荷を平準化する。

📌 このページのポイント
メッセージキュー ― 非同期通信の仕組み プロデューサー (送信側) メッセージキュー msg3 msg2 msg1 ← 入 出 → おおむね到着順 コンシュ ーマー (受信側) メッセージキューのメリット 非同期処理 送信側は受信を 待たなくてよい 負荷分散 複数コンシューマーで 処理を分散 疎結合 送受信が独立して スケール可能
メッセージキューのイメージ
ひよこ ひよこ
直接APIを呼べばいいのでは?
ペンギン先生 ペンギン先生
同期的なAPI呼び出しだと、受信側が止まっていたらエラーになるし、受信側が遅いと送信側も待たされるよね。メッセージキューなら送信側はキューに入れた時点で次の仕事に進めて、受信側は自分のペースで取り出して処理できるんだ。お店で注文票を貼っておき、厨房が順に作るイメージだよ。
ひよこ ひよこ
どんな場面で使う?
ペンギン先生 ペンギン先生
例えば、動画や画像のアップロードはすぐ受け付けて、変換のような重い処理は裏で順に行う場面だね。たくさんの処理を複数のワーカーに振り分けたり、データベースへの書き込みをまとめて後で処理したりするのにも使われるよ。
ひよこ ひよこ
Amazon SQSはどう?
ペンギン先生 ペンギン先生
AWSのメッセージキューサービスだよ。標準キューは非常に高いスループットに対応する代わりに、順序は「できるだけ」で保証されず、同じメッセージが2回以上届くこともある。FIFOキューはメッセージグループごとに送った順に届き、重複を防ぐ仕組みもあるんだ。FIFOキューはバッチ処理なしだとAPIごとに秒間300回までなどの上限があるよ(高スループットモードなどで引き上げ可能)。
ひよこ ひよこ
同じメッセージが2回届いたら困らない?
ペンギン先生 ペンギン先生
困らないように、受信側の処理を「冪等」(同じメッセージを何回処理しても結果が変わらない)にしておくのが大事だよ。AWSも、標準キューでは重複する可能性に備えて冪等な処理にするよう勧めているんだ。
ひよこ ひよこ
メッセージの処理が何度も失敗したらどうなる?
ペンギン先生 ペンギン先生
SQSでは「デッドレターキュー(DLQ)」を設定しておくと、決めた受信回数(maxReceiveCount)を超えても処理できなかったメッセージをDLQへ移せるよ。移したメッセージは原因を調べたあと、元のキューに戻す(redrive)こともできる。ただメッセージには保存期間があるから、DLQの保存期間は元のキューより長くしておくのがおすすめだよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「メッセージキュー」って出てきたら「システム間で非同期にメッセージをやり取りする仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Message Queue」 = メッセージの待ち行列
💬 Queue(待ち行列)にMessage(伝言)を入れて、受け手が取り出して処理する。郵便ポストのイメージだよ

参考資料

← 用語集にもどる