Amazon SQSとSNSとは ― キューと通知の違い
SQSは
SQSとSNSの違いは、1通のメッセージを受け取る相手の数
注文を受けたら、在庫を減らし、確認のメールも送る。こうした処理をつなぐとき、アプリどうしを直接呼ばずに、間にAmazon SQSやAmazon SNSを置くことがあります。どちらもメッセージを受け渡すサービスで、違いは1通を受け取る相手の数にあります。
SQSは、メッセージをためておき、受け取る側が取りに来るキューのサービスです。1通のメッセージを受け取るのは、1つの処理だけです。SNSは、トピックに届いたメッセージを購読者の全員へ届ける通知のサービスです。1通のメッセージが、全員にコピーされます。
間に置くと、送る側と受け取る側を切り離せる
注文アプリが、注文の処理を直接呼び出す構成を考えます。この構成では、処理する側が止まっていると、注文アプリも注文を受け付けられません。処理が混んでいる間は、注文アプリも待たされます。
間にSQSのキューを置くと、注文アプリはメッセージをキューに入れるだけで済みます。処理する側は、自分の速さでキューから取り出します。AWSの開発者ガイドは、この形を「送る側と受け取る側が同時に動いている必要がない」と説明しています。受付だけをすぐに済ませ、処理を後に回す考え方は、バッチ処理とリアルタイム処理の記事も参考になります。
このように、システムの各要素が相手の状態に左右されない構成を疎結合と呼びます。SNSでも、送る側は受け取る側を直接呼び出さず、トピックにメッセージを発行するだけです。違いは、メッセージを1つの処理に渡すか、全員に配るかにあります。
1つのアプリを小さなサービスに分けるマイクロサービスでも、サービスどうしをキューでつなぐことがあります。キューは受け渡しだけをします。複数の処理の順番や分岐まで管理したいときは、AWS Step Functionsを使います。
Amazon SQSとは、受け取る側が取りに行くキュー
SQSでメッセージを送る側をプロデューサ、受け取る側をコンシューマと呼びます。プロデューサがキューに送ったメッセージは、SQSの複数のサーバに冗長化して保存されます。コンシューマは、処理できるようになったときに自分からキューへ取りに行きます。
取りに行く方法には2つあります。ショートポーリングは、メッセージが無くてもすぐに応答を受け取る方法です。ロングポーリングは、メッセージが届くまで最大20秒待ってから応答を受け取る方法です。空の応答を減らせます。
コンシューマが受け取ったメッセージは、すぐには消えずにキューに残ります。ただし、一定の時間、そのメッセージはほかのコンシューマから見えなくなります。この時間を可視性タイムアウトと呼びます。既定は30秒です。
処理を終えたコンシューマは、メッセージを削除します。削除しないままタイムアウトが過ぎると、メッセージは再び見えるようになり、別のコンシューマが受け取れます。処理の途中でサーバが止まっても、保持期間を過ぎるまでは、メッセージは失われません。
キューには、標準キューとFIFOキューの2種類があります。標準キューは、同じメッセージが2回以上届く場合があります。届く順番も、送った順とは限りません。FIFOキューは、同じグループのメッセージを送った順に届け、重複を防ぎます。
Amazon SNSとは、トピックの購読者に届ける通知のサービス
SNSでメッセージを送る側をパブリッシャ、受け取る側をサブスクライバと呼びます。パブリッシャは、トピックという窓口にメッセージを発行します。トピックを購読しているサブスクライバの全員に、同じメッセージが届きます。ただし、購読ごとに条件を付けると、その購読者には条件に合うメッセージだけが届きます。
SNSは、受け取る側が取りに来るのを待たずに、自分からメッセージを届けます。この届け方をプッシュと呼びます。購読者には、SQSのキュー・Lambda関数・HTTP(S)のURL・メールアドレス・電話番号へのSMS・モバイルアプリなどを登録できます。
購読者が一時的に受け取れないとき、SNSは配信を再試行します。再試行が上限に達したメッセージは、移動先を設定していなければ破棄されます。止まっている購読者の分を残したいときは、後の節で説明するSQSとの組み合わせを使います。
SQSとSNSの違いを、メッセージの流れで比べる
次の図は、同じ「注文1」のメッセージを送ったときの流れです。上の段がSQS、下の段がSNSです。ステップ2で、SQSでは1つの処理係だけが受け取ります。SNSでは、3つの購読者の全員に届きます。
注文アプリが「注文1」のメッセージを送ります。SQSでは、メッセージがキューに入ります。SNSでは、メッセージがトピックに発行されます。この時点では、どちらも受け取る側にはまだ届いていません。
SQSでは、手の空いた処理係が、自分からキューへ取りに行きます。注文1を受け取るのは、取りに行った処理係です。受け取られたメッセージはキューに残ったまま、ほかの処理係からは見えなくなります。SNSでは、トピックが購読者の全員へ、同じメッセージのコピーを届けます。
SQSでは、処理を終えた処理係が、キューにメッセージの削除を指示します。これで注文1はキューからなくなります。SNSでは、在庫・メール・分析がそれぞれ自分のコピーを処理します。1通のメッセージが、3つの処理に使われたことになります。
SQSの処理係は、どれも同じ処理を行います。どの処理係が受け取ってもよいので、台数を増やせば処理を分担できます。SNSの購読者は、在庫・メール・分析のように、それぞれ別の処理を行います。
| 比べる | SQS | SNS |
|---|---|---|
| 受け取り方 | 受け取る側がキューへ取りに行く | SNSが購読者へ届ける |
| 1通を受け取る相手 | 取りに行った処理のうち1つ | 購読者の全員 |
| 受け取ったあと | 受け取る側が削除するまでキューに残る | 購読者へ届けたら終わる |
| 受け取れない | 保持期間の間、キューに残る | 再試行し、上限に達すると破棄する。移動先を設定していれば、そこへ移す |
| 主な受け取り手 | EC2やLambdaなどで動く処理 | SQS・Lambda・HTTP(S)・メール・SMS・モバイル通知 |
SNSとSQSを組み合わせると、全員に配って取りこぼさない
SNSは全員に配信できます。ただし、止まっている購読者の分は、移動先が無ければ再試行の上限に達したあとに破棄されます。SQSは、保持期間の間メッセージを残せます。ただし、1通を受け取るのは1つの処理だけです。
AWSの開発者ガイドは、SNSのトピックに処理ごとのSQSキューを購読させる組み合わせを紹介しています。
トピックに発行したメッセージは、購読している各キューへコピーされます。各処理は、自分のキューから取り出します。このように1通を複数の宛先へ広げる形を、ファンアウトと呼びます。
図では、メール送信の処理が止まっています。その間も注文1はメール送信用のキューに残るので、保持期間内であれば、再開後に取り出せます。保持期間の既定は4日で、最長14日まで延ばせます。
SQSとSNSの使い分けは、受け取る相手と待てるかで決まる
1件の仕事を、手の空いた処理のどれか1つに任せたいならSQSが向きます。1つの出来事を、複数の相手に同時に知らせたいならSNSが向きます。複数の相手に知らせつつ、止まっている相手の分も残したいなら、SNSとSQSを組み合わせます。次の図で場面を選ぶと、どれが向くかと理由が切り替わります。
AWSには、同じくサービスどうしをつなぐAmazon EventBridgeもあります。イベントの中身を見て宛先を選ぶサービスです。SQS・SNSとの違いはEventBridgeの記事で比べています。
SQSとSNSの主な上限と既定値
SQSとSNSには、メッセージの大きさや保持できる期間に上限があります。数値は、2026年10月27日にAWSの公式ドキュメントで確認したものです。
| 項目 | 値 |
|---|---|
| SQSのメッセージの保持期間 | 既定は4日。60秒から14日までの間で変えられる |
| SQSの可視性タイムアウト | 既定は30秒。0秒から12時間までの間で変えられる |
| SQSのロングポーリングの待ち時間 | 最大20秒 |
| SQSのメッセージの大きさ | 最大1 MiB |
| SNSのメッセージの大きさ | 既定は最大256 KiB。トピックの設定で1 MiBまで上げられる |
| SNSがSQS・Lambdaへ届けるときの再試行 | 23日をかけて、合計100,015回まで試行する |
最新の値は、SQSのメッセージの上限のページで確認してください。SNSの値は、SNSの上限のページと配信の再試行のページにあります。
参考にした資料
- AWS「What is Amazon Simple Queue Service?」(SQSの定義、メッセージの流れ、保持期間、SNSとの違い)
- AWS「Amazon SQS visibility timeout」(可視性タイムアウトの既定値と、削除しないときの動き)
- AWS「Amazon SQS queue types」(標準キューとFIFOキューの違い)
- AWS「Amazon SQS short and long polling」(ショートポーリングとロングポーリング)
- AWS「Amazon SQS message quotas」(メッセージの大きさ・保持期間・可視性タイムアウトの上限)
- AWS「What is Amazon SNS?」(SNSの定義、購読者の種類、ファンアウトと通知の例)
- AWS「Fanout Amazon SNS notifications to Amazon SQS queues for asynchronous processing」(プッシュとポーリング、組み合わせたときの動き)
- AWS「Amazon SNS message delivery retries」(配信の再試行と、尽きたあとの扱い)
- AWS「Amazon SNS message filtering」(購読ごとに条件を付けて、届くメッセージを絞る仕組み)
- AWS「Amazon Simple Notification Service endpoints and quotas」(SNSのメッセージの大きさの上限)
練習問題(全4問)
正解:受け取る
SQSでは、
正解:トピックを
SNSは、
正解:メッセージが
AWSの
正解:SNSの
トピックが
選んでから「採点する」を押すと、解説つきで答え合わせができます。