こちらは新しい記事シリーズでflociを利用しAWSの勉強を進めたいと思います。第2話はSQSの仕組み、そして動作を一緒に見てみましょう。

Reference Link
My環境
こちらは自分の環境です。
threespc01@threespc01-MINI-S:~$ lscpu
|
|---|
threespc01@threespc01-MINI-S:~$ cat /etc/os-release
|
|---|
SQS?
SQS(Simple Queue Service)はAWSが提供するメッセージキューサービスです。
システム間でメッセージを非同期にやり取りするための仕組みです。

基本的な仕組み
Producer(送信側)→ キュー → Consumer(受信側)
- Producer → メッセージを送信する側(アプリ、サーバーなど)
- キュー → メッセージを一時的に保管する場所
- Consumer → メッセージを受信して処理する側(ワーカーなど)
重要な概念
Visibility Timeout
- メッセージを受信すると、一定時間(デフォルト30秒)他のConsumerから見えなくなる
- 二重処理を防ぐための仕組み
- 処理成功 → delete-message で削除
- 処理失敗 → そのまま終わる → タイムアウト後に再び受信可能
At least once delivery
- メッセージは少なくとも1回は必ず届く
- ただし稀に重複して届くこともあるので、受信側で冪等性(同じ処理を何度やっても結果が同じ)を考慮する必要がある
Dead Letter Queue(DLQ)
- 何度も処理に失敗したメッセージを別のキューに移す仕組み
- 問題のあるメッセージを隔離して後で調査できる
主なコマンド
操作 | コマンド |
|---|---|
キュー作成 | aws sqs create-queue |
メッセージ送信 | aws sqs send-message |
メッセージ受信 | aws sqs receive-message |
メッセージ削除 | aws sqs delete-message |
全件削除 | aws sqs purge-queue |
キュー削除 | aws sqs delete-queue |
処理の基本フロー
① キュー作成
② Producerがメッセージ送信
③ Consumerがメッセージ受信(Visibility Timeout開始)
④-a 処理成功 → delete-messageで削除
④-b 処理失敗 → そのまま終わる → タイムアウト後に再処理
SQSが向いているユースケース
- 非同期処理(注文処理、メール送信など)
- 複数のWorkerで並列処理したい場合
- システム間の疎結合化(直接通信をなくしたい)
- 負荷の平準化(急激なリクエスト増加をキューで吸収)
注意点
- メッセージの順番は保証されない(FIFOキューを使えば保証される)
- 範囲指定での削除はできない
- 同じメッセージが複数回届く可能性がある(冪等性の考慮が必要)
キュー作成
こちらのコマンドでキューを作成します。
aws sqs create-queue \
|
|---|
Done!
{
|
|---|
キューにメッセージ送信
こちらのコマンドでsoup-queceキューにメッセージを送信します。
aws sqs send-message \
|
|---|
Done!
{
|
|---|
キューにメッセージ受信
こちらのコマンドでsoup-queceキューにメッセージを受信します。
threespc01@threespc01-MINI-S:~$ aws sqs receive-message –queue-url http://localhost:4566/000000000000/soup-quece |
|---|
Done!メッセージが受信されました。
{
|
|---|
もしすぐ同じコマンドでsoup-queceキューを受信したら…
threespc01@threespc01-MINI-S:~$ aws sqs receive-message –queue-url http://localhost:4566/000000000000/soup-quece |
|---|
下記の通り、空メッセージが帰ってきました。
{
|
|---|
しばらく待つと…
threespc01@threespc01-MINI-S:~$ aws sqs receive-message –queue-url http://localhost:4566/000000000000/soup-quece |
|---|
また同じメッセージが受信されました。
{
|
|---|
複数のメッセージをキューに
今度は複数のメッセージを一気にキューに送信します。
threespc01@threespc01-MINI-S:~$ aws sqs send-message –queue-url http://localhost:4566/000000000000/soup-quece –message-body “Text_002”
|
|---|
複数のTerminal検証
次は複数のターミナルを起動し、メッセージの受信動作を確認します。
TerminalA
最初に1つ目のターミナルをキューからデータを取ります。
threespc01@threespc01-MINI-S:~$ aws sqs receive-message –queue-url http://localhost:4566/000000000000/soup-quece |
|---|
ここで”Text_002”を受け取りました。
{
|
|---|
TerminalB
次は別のターミナルからもう一度キューからメッセージを取ります。
threespc01@threespc01-MINI-S:~$ aws sqs receive-message –queue-url http://localhost:4566/000000000000/soup-quece |
|---|
先程TerminalAが受け取った”Text_002”も受けることできず、次のメッセージ”Text_003”に取りました。
{
|
|---|
Visibility Timeout設定
では、先程受信したメッセージはいつからまた取得できるでしょうか?それはVisibility Timeout設定の設定に左右されます。短すぎると処理中に再び見えてしまい二重処理のリスクがあり、長すぎると失敗時のリカバリが遅くなります。
① キュー: [メッセージA] ← 見える状態
② Consumer A が receive-message
→ メッセージAが30秒間「非表示」になる
③ Consumer B が receive-message
→ 何も返ってこない(非表示中)
④-a Consumer Aが処理成功
→ delete-message → 完全に削除
④-b Consumer Aが処理失敗・クラッシュ
→ 30秒後に自動的に「見える」状態に戻る
→ Consumer Bが再処理できる
キュー作成時に設定
aws sqs create-queue \
|
|---|
既存キューに設定
aws sqs set-queue-attributes
|
|---|
メッセージを取り
次はメッセージを取り出します。
threespc01@threespc01-MINI-S:~$ aws sqs receive-message –queue-url http://localhost:4566/000000000000/soup-quece |
|---|
{
|
|---|
もちろん、すぐ同じメッセージ取り出すことはできません。
threespc01@threespc01-MINI-S:~$ aws sqs receive-message –queue-url http://localhost:4566/000000000000/soup-quece |
|---|
{
|
|---|
ですが、30sのTimeoutすぎると、また同じメッセージを取り出せます。
threespc01@threespc01-MINI-S:~$ aws sqs receive-message –queue-url http://localhost:4566/000000000000/soup-quece |
|---|
{
|
|---|
Dead Letter Queue(DLQ)
そもそもなぜDead Letter Queueが必要なのか?
通常のキューだと、壊れたメッセージや処理できないメッセージがキューを占領し続けてしまいます。
メッセージA → 処理失敗 → 30秒後に再処理
|
|---|
DLQがあると、正常なメッセージだけ処理継続できます。
通常キュー: メッセージA → 失敗
|
|---|
いつDLQを使いますか?
ユースケース | 説明 |
|---|---|
データ不正 | 壊れたメッセージを隔離 |
バグ調査 | 失敗したメッセージを保存して後から分析 |
本番障害対応 | 問題のあるメッセージだけ別処理 |
失敗はどう判定?
SQSは「削除されたかどうか」だけを見ています。
受信 → Visibility Timeout以内にdelete-message → 成功(削除される)
受信 → Visibility Timeout以内にdelete-message無し → 失敗とみなす
つまり明示的に「失敗」と伝える必要はなく、削除しなければ自動的に失敗扱いになります。
ApproximateReceiveCountで失敗回数を追跡
1回目受信 → ApproximateReceiveCount: 1 → 失敗
2回目受信 → ApproximateReceiveCount: 2 → 失敗
3回目受信 → ApproximateReceiveCount: 3 → 失敗
↓
maxReceiveCount=3ならDLQへ移動
DLQ用のキューを作成
aws sqs create-queue \
|
|---|
DLQのARNを取得
threespc01@threespc01-MINI-S:~$ aws sqs get-queue-attributes \
|
|---|
DLQのキューのARNが取得できました。
{
|
|---|
DLQのメッセージ確認
現在DLQキューのメッセージを確認します。
threespc01@threespc01-MINI-S:~$
|
|---|
{
|
|---|
通常キューにDLQを設定
現在使用するキューとDLQキューと接続し、最大Counterを3に設定します。
threespc01@threespc01-MINI-S:~$ aws sqs set-queue-attributes \
|
|---|
DLQのメッセージ確認
最後はMessageを複数回送信し、DLP キューには3回以上処理に失敗したメッセージが格納されます。
threespc01@threespc01-MINI-S:~$ aws sqs receive-message –queue-url http://localhost:4566/000000000000/my-queue-dlq –max-number-of-messages 10 |
|---|
{
|
|---|
基本コマンド list-queues
こちらのコマンドで現在存在しているキューをリストアップできます。
threespc01@threespc01-MINI-S:~$ aws sqs list-queues |
|---|
{
|
|---|
基本コマンド get-queue-attributes
こちらはあるキューの設定を読み出すことができます。
threespc01@threespc01-MINI-S:~$ aws sqs get-queue-attributes \
|
|---|
ApproximateNumberOfMessagesNotVisible
|
|---|
キューのメッセージ削除‐Purge
キュー内の全メッセージを一括削除するコマンドです。
threespc01@threespc01-MINI-S:~$ aws sqs purge-queue \
|
|---|
最後は下記のコマンドでキューを確認すると、メッセージ残数が0になります。
threespc01@threespc01-MINI-S:~$ aws sqs get-queue-attributes –queue-url http://localhost:4566/000000000000/soup-quece –attribute-names |
|---|
ApproximateNumberOfMessages
|
|---|
キューごと削除‐delete-queue
最後は下記のコマンドでキューを削除します。
threespc01@threespc01-MINI-S:~$ aws sqs delete-queue \
|
|---|
項目 | purge-queue | delete-queue |
|---|---|---|
メッセージ | 削除 | 削除 |
キュー自体 | 残る | 削除される |
復元 | 不要 | 再作成が必要 |
下記のように、キューsoup-queceが削除されたことがわかりました。
threespc01@threespc01-MINI-S:~$ aws sqs list-queues
|
|---|