MENU

SQSの標準キューとFIFOキュー、「順番と重複が大事か」で選ぶと整理できた

SQSの標準キューとFIFOキュー、「順番と重複が大事か」で選ぶと整理できたことを説明する画像

おはようございます、YASUです。

前にSQS・SNS・EventBridgeの違いを整理しましたが、DVAの模擬試験では、SQSの中の「標準キューとFIFOキューのどちらを選ぶか」で間違えました。今日はその続きとして、SQSの中身をシンプルに整理します。

目次

結論

順番と重複が大事ならFIFOキュー、とにかく大量にさばきたいなら標準キューです。メッセージの受け取り方は、基本的にロングポーリングを使います。

標準キューとFIFOキューの違い

  • 標準キュー:ほぼ無制限のスループットで処理できる。ただし、メッセージの順番が前後することがあり、同じメッセージが2回以上届くことがある
  • FIFOキュー:送った順番どおりに取り出せる。同じメッセージは重複せず、1回だけ処理される。その代わり、スループットに上限がある

自分なりのイメージでは、標準キューは「とにかく速く受け付ける窓口」、FIFOキューは「番号札どおりに、1件ずつ丁寧に処理する窓口」です。

標準キューは重複が起こりうるので、処理する側で、同じメッセージが来ても結果が変わらないようにしておく(べき等にする)、という考え方が必要でした。

FIFOキューの2つのID

FIFOキューには、順番と重複を管理するための、2つのIDがあります。

  • メッセージグループID:メッセージをグループに分ける。同じグループの中では、必ず1件ずつ順番に処理される。グループが違えば、並行して処理できる
  • メッセージ重複排除ID:同じ重複排除IDのメッセージを、5分間の重複排除間隔内に送ると、重複として扱われ、1つだけ配信される。指定しない場合でも、コンテンツベースの重複排除を有効にしておけば、本文から自動で作られる

「順番を守る範囲はグループの中だけ」という点が、最初は分かりにくかったです。グループを細かく分けるほど、並行して処理できるので、スループットも上がります。

試験で気をつけたい点

  • FIFOキューの名前は、末尾が.fifoである必要がある
  • FIFOキューは、メッセージごとの遅延(DelaySeconds)に対応していない。キュー単位の遅延だけ使える
  • FIFOキューの標準のスループットは、バッチ処理なしで1秒あたり最大300件、バッチ処理ありで最大3,000件。高スループットモードを有効にすると、さらに増やせる(上限はリージョンごとに違う)

ショートポーリングとロングポーリング

もう1つ、模擬試験で出てきたのが、メッセージの受け取り方の違いです。

  • ショートポーリング:キューが空でも、すぐに返事が返る。サーバーの一部だけを調べるため、メッセージがあっても、返ってこないことがある
  • ロングポーリング:メッセージが届くまで、指定した時間だけ待つ。すべてのサーバーを調べ、空のレスポンスが減るので、コストの削減にもなる

イメージでは、ショートポーリングは「郵便受けを何度も覗きに行く」、ロングポーリングは「郵便が届くまで、玄関で少し待つ」感じです。

待つ時間はWaitTimeSecondsで1〜20秒に設定でき、ほとんどの場合は20秒が推奨されています。初期設定は0秒で、ショートポーリングになっています。AWSのドキュメントでは、ほとんどの場合、ロングポーリングが推奨されています。

前回の可視性タイムアウトとのつながり

前回整理した可視性タイムアウトは、受け取ったメッセージを、他のコンシューマーから一定時間隠す仕組みでした。標準キューで重複が起こりうる理由の1つが、この時間内に処理が終わらず、同じメッセージがもう一度見えてしまうことだと理解しました。

まとめ

  • 標準キューは、スループット重視。順番が前後したり、重複したりすることがある
  • FIFOキューは、順番と1回だけの処理が大事な時に使う。スループットには上限がある
  • FIFOの順番は、メッセージグループIDの中だけで守られる。重複排除IDで、5分間の重複を防ぐ
  • FIFOキューは名前の末尾が.fifoで、メッセージごとの遅延には対応していない
  • ポーリングは、ほとんどの場合、ロングポーリング(20秒)が推奨される

順番と重複の話が、メッセージグループIDと重複排除IDという、2つの仕組みに分かれていると分かり、すっきりしました。それでは、また明日!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次