Amazon SQS とは

Amazon Simple Queue Service の略で、AWSが提供するフルマネージド型のメッセージキューイングサービス

出典: What is Amazon Simple Queue Service?

“Amazon Simple Queue Service (SQS) is a managed messaging service offered by AWS that allows decoupling and integrating distributed software systems and components.”


メッセージングサービスとは

非同期処理においてシステム間でメッセージを仲介するサービスの総称。キュー、ストリーム、トピック、バスなど様々な種類がある

SQSはその中でもキューイングに特化しており、可用性やスケーリングに優れ、ほぼ無制限のTPSを実現する

TPS とは

Transactions Per Second の略で、1秒間に処理できるトランザクション数を表すパフォーマンス指標

出典: Transactions Per Second (TPS)

“Transaction per Second (TPS) is a standard metric that measures the number of transactions a computer system, network, or application can process in one second.”


構成要素

┌──────────────┐      ┌─────────────┐      ┌──────────────┐
│ プロデューサー │ ──→ │   キュー    │ ──→ │ コンシューマー │
│  (送信側)     │      │ [メッセージ] │      │   (受信側)    │
└──────────────┘      └─────────────┘      └──────────────┘
用語説明
プロデューサーキューにメッセージを送信する側
コンシューマーキューからメッセージを受信して処理する側
キューメッセージを一時的に保存する場所
メッセージ最大256KBのテキストデータ

出典: Amazon SQS Features

“Amazon SQS features include unlimited queues and messages, payload sizes up to 256KB”

メッセージは最大14日間保持可能で、キューに保存できるメッセージ数は無制限

出典: Amazon SQS Features

“message retention”


キューの種類

SQSには2種類のキューがある

種類スループット配信保証順序
Standard無制限少なくとも1回ベストエフォート
FIFO最大3,000msg/秒正確に1回厳密に保証

出典: Amazon SQS queue types

“Standard queues provide unlimited throughput, at-least-once delivery, best-effort ordering” “FIFO queues offer high throughput, exactly-once processing, first-in-first-out delivery”


受信処理の仕組み

基本的な流れ

コンシューマーは定期的にキューをポーリングしてメッセージを取得する

1. コンシューマーが ReceiveMessage でメッセージを取得
2. メッセージを処理
3. 処理完了後に DeleteMessage で削除

ReceiveMessage だけでは削除されない

ReceiveMessage を呼び出してもメッセージはキューから削除されない。これはコンシューマーが処理に失敗した場合、メッセージを再処理できるようにするため

可視性タイムアウト

ここで疑問が生じる。処理中のメッセージが他のコンシューマーに取得されてしまわないか?

これを防ぐのが可視性タイムアウト。メッセージを取得すると、一定時間そのメッセージは他のコンシューマーから「見えない」状態になる

出典: Amazon SQS visibility timeout

“Amazon Simple Queue Service (SQS) offers a visibility timeout feature that makes received messages temporarily invisible to other consumers while being processed. This prevents duplicate work and maintains system efficiency.”

1. コンシューマーAがメッセージを取得
2. 可視性タイムアウト開始(デフォルト30秒)
3. この間、他のコンシューマーからは見えない
4. タイムアウト内に処理完了 → DeleteMessage で削除
5. タイムアウト超過 → メッセージが再び見える状態に戻り、再処理可能に

出典: Amazon SQS visibility timeout

“If a message isn’t processed and deleted before the visibility timeout expires, it becomes visible again in the queue and can be retrieved for another processing attempt.”

少なくとも1回配信と冪等性

Standardキューは「少なくとも1回配信」を保証する。これは同じメッセージが複数回配信される可能性があることを意味する

出典: Amazon SQS at-least-once delivery

“Amazon Simple Queue Service (SQS) ensures message redundancy and high availability by storing copies of messages on multiple servers. In rare instances, a server storing a message copy might be unreachable when attempting to receive or delete a message. In such cases, the message copy remains on the unavailable server, resulting in the message being received again.”

そのため、コンシューマー側では冪等性を意識した実装がベストプラクティスとなる

冪等性とは

同じ処理を何度実行しても結果が同じになる性質のこと

出典: Amazon SQS at-least-once delivery

“applications should be designed to be idempotent, meaning they can process the same message multiple times without any adverse effects”


SQS + Lambda アーキテクチャ

なぜ相性が良いのか

通常、コンシューマーは以下を自前で実装する必要がある

  • 定期的なポーリング
  • 処理後のメッセージ削除
  • 負荷に応じたスケーリング

SQSをLambdaのイベントソースとして設定すると、これらをLambdaにオフロードできる

出典: Amazon SQS - AWS Prescriptive Guidance

“AWS Lambda can consume messages from an SQS queue using Lambda Event Source Mapping (ESM), which polls the queue and delivers messages to the Lambda function.”

イベントソースマッピング

SQSキューをLambdaのイベントソースとして設定すると、Lambda側で自動的にポーリングしてくれる

出典: Using Lambda with Amazon SQS

“Lambda polls the queue and invokes the function synchronously with an event containing a batch of messages.”

┌─────────────┐                      ┌──────────────┐
│  SQSキュー   │ ←── 自動ポーリング ── │   Lambda     │
│ [メッセージ] │ ──────────────────→ │ (処理実行)    │
└─────────────┘   イベント配信        └──────────────┘
                                          │
                                    処理成功時に自動削除

Lambda側で自動化される処理

処理説明
ポーリング定期的にキューを監視してメッセージを取得
スケーリングメッセージ量に応じてLambdaの同時実行数を自動調整
削除処理成功時にメッセージを自動削除

出典: Creating and configuring an Amazon SQS event source mapping

“Lambda processes messages in batches, starting with five batches at a time and scaling up to 1,250 concurrent invocations per minute.”