メインコンテンツまでスキップ

Amazon SQS とは?キューの種類やメッセージの送受信を学ぼう

タグ:

アプリケーションのコンポーネント間でデータをやり取りする際、送信側と受信側が直接つながっていると、どちらかが停止したときにデータが失われるリスクがあります。Amazon SQS はメッセージを一時的に保管するキューを提供し、コンポーネント間を疎結合にするマネージドサービスです。本記事では SQS の基本概念からキューの作成・メッセージの送受信手順まで説明します。

Amazon SQS とは

SQS(Simple Queue Service)は AWS が提供するフルマネージドなメッセージキューイングサービスです。送信側(プロデューサー)がキューにメッセージを送り、受信側(コンシューマー)がキューからメッセージを取り出すことで、コンポーネント同士を直接接続しないで非同期に通信できます。

キューはメッセージのバッファとして機能するため、受信側が一時的に停止していてもメッセージは失われないです。また、受信側を複数用意することで処理を分散させ、スループットを向上させることもできます。

主な特徴

SQS にはマネージドサービスならではの特徴があります。それぞれ把握しておきましょう。

特徴概要
フルマネージドインフラの管理や冗長化は AWS が担うため、運用の手間が少ない
高可用性メッセージは複数のアベイラビリティーゾーンに自動で複製されるため、単一障害点がない
無制限のスループット標準キューはほぼ無制限の 1 秒あたりのメッセージ数(TPS)をサポートする
柔軟な保持期間メッセージの保持期間は最短 1 分から最長 14 日の範囲で設定できる(デフォルトは 4 日)
従量課金送受信したメッセージ数に応じた課金で、毎月 100 万件のリクエストまでは無料枠がある

一度取得したメッセージは可視性タイムアウトと呼ばれる期間中、他のコンシューマーからは見えなくなります。コンシューマーが処理完了後にメッセージを削除しないと、タイムアウト後に再度取得可能になり、再処理が発生する点に注意しましょう。

キューの種類

SQS には標準キューと FIFO キューの 2 種類があります。用途に合わせて使い分けましょう。

項目標準キューFIFO キュー
スループットほぼ無制限最大 3,000 TPS(バッチ処理時)
メッセージ順序ベストエフォート(保証されない)厳密に FIFO 順序を保証
重複配信まれに重複することがある重複なし
ユースケースログ収集・通知・大量処理など注文処理・決済・在庫更新など

標準キューはスループットを最優先するためメッセージの順序が保証されず、まれに同じメッセージが複数回配信されることがあります。処理の冪等性(同じ操作を複数回行っても結果が変わらない性質)を担保する設計にしておくと安全です。

FIFO キューはメッセージの順序と重複排除を保証しますが、スループットには上限があります。キュー名の末尾を .fifo にする必要があります。

デッドレターキュー

処理に繰り返し失敗したメッセージを別のキューに移動させる仕組みがデッドレターキュー(DLQ)です。

コンシューマーが処理を失敗してメッセージを削除しない場合、可視性タイムアウト後にメッセージが再度取得可能になります。これが設定した最大受信数(maxReceiveCount)を超えると、メッセージは DLQ へ自動的に移動されます。DLQ に移動したメッセージを確認・再処理することで、問題のあるメッセージを追跡しやすくなります。

SQS コンソールには DLQ に移動したメッセージを元のキューに戻す「DLQ の再処理」機能もあります。

AWS CLI で SQS を使ってみる

AWS CLI を使ってキューの作成からメッセージの送受信・削除までの基本的な流れを体験してみましょう。

キューを作成する

まず標準キューを作成します。キューの作成には --queue-name でキュー名を指定します。

❯ aws sqs create-queue --queue-name exrecord-queue
{
"QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789012/exrecord-queue"
}

以降のコマンドでこの URL を使うため、変数に保存します。

QUEUE_URL="https://sqs.ap-northeast-1.amazonaws.com/123456789012/exrecord-queue"

メッセージを送信する

キューにメッセージを送信します。--message-body に送信したい内容を文字列で指定します。

❯ aws sqs send-message \
--queue-url "$QUEUE_URL" \
--message-body "SQS からのテストメッセージです。"
{
"MD5OfMessageBody": "4b999f2b9ac63a0e8c4a2bea7ae2e12b",
"MessageId": "ca0330b3-c5e5-44d3-85a4-4062ef5dd0f5"
}

メッセージを受信する

キューからメッセージを取得します。取得したメッセージは可視性タイムアウト中は他のコンシューマーから見えなくなります。

❯ aws sqs receive-message --queue-url "$QUEUE_URL"
{
"Messages": [
{
"MessageId": "ca0330b3-c5e5-44d3-85a4-4062ef5dd0f5",
"ReceiptHandle": "AQEBwJnKyrHigUMZj...",
"MD5OfBody": "4b999f2b9ac63a0e8c4a2bea7ae2e12b",
"Body": "SQS からのテストメッセージです。"
}
]
}

メッセージを削除する

処理が完了したらメッセージをキューから削除します。削除しないと可視性タイムアウト後に再度配信されます。

❯ aws sqs delete-message \
--queue-url "$QUEUE_URL" \
--receipt-handle "AQEBwJnKyrHigUMZj..."

キューを削除する

不要になったキューを削除します。削除するとキュー内のメッセージもすべて消えるため、事前に処理が完了しているか確認しましょう。

❯ aws sqs delete-queue --queue-url "$QUEUE_URL"

まとめ

  • Amazon SQS はコンポーネント間を疎結合にするフルマネージドなメッセージキューイングサービス
  • 標準キューはほぼ無制限のスループット、FIFO キューは順序保証と重複排除を提供する
  • 可視性タイムアウト中は他のコンシューマーからメッセージが見えなくなる
  • 処理に失敗し続けたメッセージはデッドレターキューに移動させることで追跡・再処理しやすくなる