📬

Amazon SQSの標準タイプとFIFOタイプの違いを体験

に公開

Amazon SQS(Simple Queue Service)の標準タイプとFIFOタイプの違いを理解するため、メッセージの送信から受信までを実際に行い、それぞれの動作を確認した。以下はその学習メモ。

Amazon SQSは、サービス間の連携に使うフルマネージドのメッセージキューイングサービスである。メッセージを利用して処理を非同期化したり、負荷分散したりすることができる。SQSはプル型モデルであり、受信側は任意のタイミングでメッセージをポーリング(問い合わせ)する。

この仕組みは、トラフィックの急増などで処理が追いつかなくなる状況に有効である。例えば、大量のリクエストが一気にデータベースに届くとタイムアウトが発生することがあるが、SQSを挟めばリクエストは一時的にキューに蓄積され、データベースは処理能力に応じて順次処理できる。その結果、システムの安定性が向上し、過負荷による障害を防げる。

今回は、Amazon SNS(Simple Notification Service)と組み合わせた「ファンアウト」アーキテクチャも試した。ファンアウトは、1つのメッセージを複数のシステムに同時配信し、処理を並列化する仕組みである。送信側は受信システムを意識せず、SNSトピックにメッセージを送るだけで、登録されたすべてのコンシューマーに配信できる。これにより、連携処理が簡単になり、システムの拡張性も高まる。


出典:AWS Black Belt Online Seminar – Amazon SQS

標準タイプと FIFO タイプの違い

比較項目 標準タイプ FIFO タイプ
配信順序 保証なし 保証される(MessageGroupId 単位)
重複メッセージ 発生する可能性あり 重複なし(Exactly-Once)
スループット 高い(無制限に近い) 低め(300 TPS / MessageGroupId)
適用例 通知、非同期処理、モバイル通知 トランザクション処理、注文処理など順序が重要な処理

標準キューと比べてFIFOキューの方が機能的に優れている分、利用料金はFIFOキューの方が高く設定されている。なお、スループットは標準キューが優れている。


トピックの作成時にタイプを選ぶことができる。トピックの作成後にトピックタイプを変更することはできない。

ステップ1:標準タイプの SNS トピックと SQS キューを作成

SNS トピック作成

  1. SNS → トピック → 作成
  2. タイプ:Standard
  3. 名前:StandardTopic

SQS キュー作成

  1. SQS → キューの作成
  2. タイプ:Standard
  3. 名前:StandardQueue

サブスクリプション設定

  1. SNS → StandardTopic → サブスクリプションの作成
  2. プロトコル:Amazon SQS
  3. エンドポイント:StandardQueue を選択

メッセージ送信

aws sns publish --topic-arn <StandardTopicARN> \
--message "Standard Message Test"

メッセージ受信

aws sqs receive-message --queue-url <StandardQueueURL>

標準タイプの挙動

  • メッセージ順序は保証されない
  • 同じメッセージが重複して届くことがある

ステップ2:FIFO タイプの SNS トピックと SQS キューを作成

SNS FIFO トピック作成

  1. SNS → トピック → 作成
  2. タイプ:FIFO
  3. 名前:FifoTopic.fifo

SQS FIFO キュー作成

  1. SQS → キューの作成
  2. タイプ:FIFO
  3. 名前:FifoQueue.fifo

サブスクリプション設定

  1. SNS → FifoTopic.fifo → サブスクリプションの作成
  2. プロトコル:Amazon SQS
  3. エンドポイント:FifoQueue.fifo を選択

メッセージ送信(FIFO 特有の属性を指定)

aws sns publish --topic-arn <FifoTopicARN> \
--message "FIFO Message Test 1" \
--message-group-id "group1" \
--message-deduplication-id "msg1"
aws sns publish --topic-arn <FifoTopicARN> \
--message "FIFO Message Test 2" \
--message-group-id "group1" \
--message-deduplication-id "msg2"

メッセージ受信

aws sqs receive-message --queue-url <FifoQueueURL>

FIFO タイプの挙動

  • メッセージは送信順に処理される(MessageGroupId 単位)
  • 重複メッセージは発生しない

まとめ

  • 標準タイプは「速いけど順序・重複は気にしない」用途向け
  • FIFO タイプは「順序と重複なし」が重要な用途向け

Discussion