みそスープ

日記とか

SQS備忘録

SQSとは?

  • フルマネージド型のメッセージキューイングサービス
  • メッセージ数に応じて自動的にスケールするため、事前計画が不要
  • 使用料に対して課金される
  • コンシューマーがメッセージを取得しに来るポーリング方式(SNSがプッシュ方式、GCPのpub/subは両方を担っている)

※ メッセージキューイング:システム間で送信するデータを一時的に溜め込む場所を設けて、そこから順次中継していく仕組み

処理の流れ

  1. ポーリング
  2. 取得&処理
  3. 削除

用語

  • メッセージ:送信するデータ
  • プロデューサー:キューにメッセージを送信するアプリケーションやシステム
  • コンシューマー:キューからメッセージを取り出すアプリケーションやシステム
  • ポーリング:キューからメッセージを取り出すこと

ユースケース

時間がかかる処理の完了を待たずに次の処理を行いたい

  1. ユーザが、ECサイトで商品を注文する
  2. ECサイトのシステムからユーザに「受注通知」を一旦返却する(※注文は仮確定状態)
  3. ECサイトのシステムから「倉庫システム」に「在庫照会(倉庫、発送日、配達日数等)」を行う(時間がかかる重い処理)
  4. 「倉庫システム」からECサイトに「在庫確定通知」を送る
  5. ECサイトからユーザに対して「注文確定通知」を送る

アプリケーション間の連携に使用したい

画像をアップロードすると加工して、S3にアップロードしてくれる構成

  1. S3に画像をアップロード
  2. 画像アップロードをトリガーにSQSにメッセージを送信
  3. lambdaがSQSからメッセージを取得して、画像加工処理を実施(重い処理)

メッセージを送信する箇所のイメージがわかない

# キューの作成
$ aws sqs create-queue --queue-name my-queue

# キューの一覧
$ aws sqs list-queues
{
    "QueueUrls": [
        "https://sqs.ap-northeast-1.amazonaws.com/xxxxxxx/my-queue"
    ]
}

# キューにメッセージを送信
$ aws sqs send-message --queue-url "https://sqs.ap-northeast-1.amazonaws.com/xxxx/my-queue" --message-body "hello world"
{
    "MD5OfMessageBody": "xxx",
    "MessageId": "xxx"
}

# キューからメッセージを取り出す
$ aws sqs receive-message --queue-url "https://sqs.ap-northeast-1.amazonaws.com/xxx/my-queue" 
{
    "Messages": [
        {
            "MessageId": "xxx",
            "ReceiptHandle": "xxx",
            "MD5OfBody": "xxx",
            "Body": "hello world"
        }
    ]
}

# キューからメッセージを削除する
$ aws sqs delete-message --queue-url "https://sqs.ap-northeast-1.amazonaws.com/xxxx/my-queue" --receipt-handle  "xxx"

参考