Amazon SNSとAmazon SQSの違いは何ですか?


438

SNSとSQSをいつ使用するのかわからないのですが、なぜそれらは常に一緒に結合されているのですか?


あなたのコメントから私が理解したことは、次のフローで説明されています。それは正しいですか?パブリッシャー->
SNS-


@friendyogiあなたはSQLではなくSQSを意味しますか?
エレナ

回答:


624

SNSは、分散パブリッシュ/サブスクライブシステムです。メッセージは、パブリッシャーからSNSに送信されたときにサブスクライバーにプッシュされます。

SQSは分散キューイングシステムです。メッセージは受信者にプッシュされません。受信者はSQSからメッセージをポーリングまたはプルする必要があります。メッセージを複数の受信者が同時に受信することはできません。1人の受信者がメッセージを受信し、処理して削除できます。他の受信者は後で同じメッセージを受信しません。ポーリングでは、メッセージがすぐにサブスクライバーにプッシュされるSNSとは異なり、SQSでのメッセージ配信に遅延が発生します。SNSは、電子メール、SMS、HTTPエンドポイント、SQSなどのいくつかのエンドポイントをサポートしています。不明な数とタイプのサブスクライバーがメッセージを受信できるようにするには、SNSが必要です。

SNSとSQSを常に結合する必要はありません。SQSとは別に、SNSにメッセージを電子メール、SMS、またはHTTPエンドポイントに送信させることができます。SNSをSQSと結合することには利点があります。外部サービスがホストに接続することを望まない場合があります(ファイアウォールが外部からのホストへのすべての着信接続をブロックする場合があります)。大量のメッセージが原因で、エンドポイントが停止する可能性があります。電子メールとSMSは、メッセージを迅速に処理するというあなたの選択ではないかもしれません。SNSとSQSを組み合わせると、自分のペースでメッセージを受信できます。これにより、クライアントはオフラインになり、ネットワークとホストの障害に耐えることができます。また、保証付き配達も実現します。メッセージをhttpエンドポイント、電子メール、またはSMSに送信するようにSNSを構成した場合、メッセージの送信にいくつか失敗すると、メッセージがドロップされる可能性があります。

SQSは主にアプリケーションの分離またはアプリケーションの統合に使用されます。メッセージは、短い期間(最大14日間)SQSに保存できます。SNSは、メッセージの複数のコピーを複数のサブスクライバーに配布します。たとえば、アプリケーションによって生成されたデータを複数のストレージシステムに複製するとします。SNSを使用してこのデータを複数のサブスクライバーに送信し、それぞれが受信したメッセージをさまざまなストレージシステム(s3、ホストのハードディスク、データベースなど)に複製できます。


3
基本的に、プッシュ通知メッセージのようなものを実装するには、SNSとSQSを使用して、ユーザーがキューからプッシュを取得するまでsnsでのプッシュがキューに入れられることをお勧めしますか?ユーザーごとにキューを作成することはできますか?
Nick Ginanto

2
うん。SNSにはいくつでも加入できます。通知を複数のキューに送信できます。
Srikanth

こんにちは申し訳ありません。この質問は古いのですが、SQSがオフラインメッセージを認識して保存しているのではないでしょうか APNSはオフラインメッセージを保存しないため、最新のメッセージのみが保存されます。IOSデバイスがオフラインで、オフラインメッセージをすぐに保存するタイミングを知っていますか?そして、後でデバイスがオンラインに戻ったときに送信しますか?
John

2
ユーザーあたりの@NickGinanto Queueは、おそらく望んでいるものではありません。おそらく、ユーザー固有のメッセージを処理するサービスごとに1つのキューが必要です。この図は役立つことがあります。aws.amazon.com/blogs/aws/...を
トレントン

2
2018年半ば以降、SQSはラムダをトリガーできるため、その場合はpubsubに似ていることに注意してください。
cyberwombat

238

2つの比較を以下に示します。

エンティティタイプ

  • SQS:キュー(JMSと同様)
  • SNS:トピック(Pub / Subシステム)

メッセージの消費

  • SQS:プルメカニズム-コンシューマーはSQSからメッセージをポーリングしてプルします
  • SNS:プッシュメカニズム-SNSはメッセージを消費者にプッシュします

使用事例

  • SQS:2つのアプリケーションを分離し、並列非同期処理を可能にする
  • SNS:ファンアウト-同じメッセージを複数の方法で処理する

持続性

  • SQS:コンシューマーが利用できない場合、メッセージは一定の(構成可能な)期間保持されます
  • SNS:持続性はありません。メッセージの到着時に存在しているコンシューマのいずれかがメッセージを取得し、メッセージは削除されます。利用可能なコンシューマがない場合、メッセージは失われます。

消費者タイプ

  • SQS:すべてのコンシューマーは同一であると想定されているため、メッセージをまったく同じ方法で処理します
  • SNS:消費者はさまざまな方法でメッセージを処理する可能性があります

サンプルアプリケーション

  • SQS:ジョブフレームワーク:ジョブはSQSに送信され、反対側のコンシューマーはジョブを非同期で処理できます。ジョブの頻度が増加する場合は、コンシューマーの数を増やすだけでスループットを向上させることができます。
  • SNS:画像処理。誰かが画像をS3にアップロードした場合は、その画像に透かしを入れ、サムネイルを作成し、ありがとうメールを送信します。その場合、S3は通知をSNSトピックに公開し、3人の消費者がそれを聞いています。1つ目は画像に透かしを入れ、2つ目はサムネイルを作成し、3つ目はお礼メールを送信します。それらのすべてが同じメッセージ(画像URL)を受け取り、それらの処理を並行して行います。

1
利用可能なコンシューマがない場合は、再試行メカニズムがあり、デフォルト値は10回です。
Arpit Solanki

素敵な詳細な投稿。消費者ごとに異なるメッセージがあります-どうすればよいですか-SNSを使用して異なるトピックを定義するか、SQSを使用して異なるキューを定義しますか?ただし、トピック/キューには1つ以上のコンシューマが含まれる場合があります。
アンディDufresne

tooic / queueに複数のコンシューマーが必要であるという要件である場合、同じメッセージを複数のコンシューマーにブロードキャストする必要があると言っていると思います...そして、私の想定が正しい場合、SNSを使用することが唯一のオプションです。あなた
アラファトナルカンデ

私は「SQS:すべてのコンシューマーは同一であると想定されているため、メッセージをまったく同じ方法で処理する」とは考えていません。これは正しいことです。2つの異なるAWSサービスがSQSキューから取得し、独自の方法でメッセージを処理するSQSを使用しました(これらの異なるサービスの異なるアプリケーションロジック)。何か不足していますか?
NAD

@nad私はあなたのユースケースを理解する必要がありますが、2つのSQSコンシューマーが同じ方法でメッセージを処理していることは私には意味がありません。それはSNSの使用例です
Arafat Nalkhande

31

aws docから:

Amazon SNSを使用すると、アプリケーションはタイムクリティカルなメッセージを「プッシュ」メカニズムを介して複数のサブスクライバーに送信できるため、更新を定期的にチェックまたは「ポーリング」する必要がなくなります。

Amazon SQSは、ポーリングモデルを介してメッセージを交換するために分散アプリケーションによって使用されるメッセージキューサービスであり、各コンポーネントを同時に使用可能にする必要なく、送信コンポーネントと受信コンポーネントを分離するために使用できます。

http://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html


29

AWS SNSはパブリッシャーサブスクライバーネットワークであり、サブスクライバーはトピックにサブスクライブでき、パブリッシャーがそのトピックにパブリッシュするたびにメッセージを受信します。

AWS SQSは、キューにメッセージを格納するキューサービスです。SQSはメッセージを配信できません。SQSをポーリングしてSQSからメッセージを取得するには、外部サービス(lambda、EC2など)が必要です。

SNSとSQS、いくつかの理由で一緒に使用できます。

  1. 一部のサブスクライバには、メッセージをすぐに配信する必要がある場合と、ポーリングで後で使用するためにメッセージを保持する必要がある場合があります。このリンクを参照してください

  2. ファンアウトパターン」。これは、メッセージの非同期処理用です。メッセージがSNSにパブリッシュされると、メッセージを複数のSQSキューに並行して配信できます。これは、画像が公開されているときに、アプリケーションでサムネイルを並行してロードする場合に最適です。このリンクを参照してください

  3. 永続的なストレージ。メッセージを処理するサービスが信頼できない場合。このような場合、SNSがサービスに通知をプッシュし、そのサービスが利用できない場合、通知は失われます。したがって、SQSを永続ストレージとして使用し、後で処理することができます。


29

このスレッドの答えは少し古いので、2セント追加することにしました。

SNSは、複数のサブスクライバーを持つことができる従来のトピックとして見ることができます。たとえば、LambdaやSQSなど、1つの特定のSNSトピックの異種サブスクライバーを持つことができます。SNSを使用して、SMSメッセージや電子メールを送信することもできます。SNSで考慮すべきことの1つは、一度に受信されるメッセージ(通知)が1つだけであるため、バッチ処理を利用できないことです。

一方、SQSはQueueにすぎず、メッセージを格納して1つのコンシューマーをサブスクライブします(そうです、1つのSQSキューにN個のコンシューマーを持つことができますが、乱雑になり、すべてのコンシューマーを考慮して管理するのがはるかに難しくなります。はメッセージを少なくとも1回は読み取る必要があるため、SNSとSQSを組み合わせてこのユースケースを使用する方がよいでしょう。この場合、SNSは通知をN個のSQSキューにプッシュし、すべてのキューには1人のサブスクライバーのみがこれらのメッセージを処理します。2018年6月28日の時点で、AWSはLambda Triggers for SQSをサポートしています。つまり、ポーリングする必要はありません。メッセージのためにもう。さらに、障害が発生した場合にメッセージを送信するようにソースSQSキューにDLQを構成できます。成功した場合、メッセージは自動的に削除されます(これはもう1つの大きな改善です)。手動で削除するのを忘れた場合に、すでに処理されたメッセージが再度読み取られることを心配する必要はありません。ラムダの再試行動作を確認することをお勧めしますそれがどのように機能するかをよりよく理解するために。SQSを使用する大きな利点の1つは、バッチ処理が可能になることです。各バッチには最大10個のメッセージを含めることができるため、SQSキューに一度に100個のメッセージが到着すると、10個のLambda関数がスピンアップし(Lambdaのデフォルトの自動スケーリング動作を考慮)、これらの100個のメッセージを処理します(保持実際にはこれがハッピーパスであることに注意してください。実際には、さらにいくつかのLambda関数がバッチ内の10個未満のメッセージを読み取ってスピンアップする可能性があります。ただし、同じ100個のメッセージをSNSに投稿した場合、100個のLambda関数が起動し、不必要にコストが増加し、Lambdaの同時実行性が使い果たされます。ただし、従来のサーバー(EC2インスタンスなど)をまだ実行している場合でも、メッセージをポーリングして手動で管理する必要があります。

また、メッセージの配信順序を保証するFIFO SQSキューもあります。これはLambdaでサポートされているトリガーではないため、このタイプのキューを選択する場合は、ポーリングが依然として必要であり、メッセージを手動で削除する必要があることに注意してください。

ユースケースにはいくつかのオーバーラップがありますが、SQSとSNSの両方に独自のスポットライトがあります。

次の場合はSNSを使用します。

  • 複数の加入者が必要です
  • 箱からSMS / Eメールを送信すると便利です

次の場合はSQSを使用します。

  • 必要な加入者は1人だけです
  • バッチ処理は重要です

4

簡単に言えば、SNS-プッシュメカニズムを使用してサブスクライバーにメッセージを送信し、プルする必要はありません。SQS-分散アプリケーションがポーリングモデルを介してメッセージを交換するために使用するメッセージキューサービスであり、送信コンポーネントと受信コンポーネントを分離するために使用できます。

一般的なパターンは、SNSを使用してメッセージをAmazon SQSキューに発行し、1つ以上のシステムコンポーネントに非同期でメッセージを確実に送信することです。https://aws.amazon.com/sns/faqs/からの参照


SQSはメッセージをファンアウトしないため、多くのシステムにメッセージを送信できません。はい、多くのポーラーはそこからメッセージをプルできますが、1つのコンシューマがメッセージを削除すると、他のサブスクライバは同じメッセージを再び消費できなくなります。ファンアウトパターンを実現する場合は、SNSがSQSよりも優先されます。また、visibilityTimeoutが設定されている場合、他のシステムで処理されると、他のどのシステムもメッセージを消費できなくなります。
Thales Minussi

一般的なパターンは、SNSを使用してメッセージをAmazon SQSキューに発行し、1つまたは複数のシステムコンポーネントに非同期でメッセージを確実に送信することです。aws.amazon.com/sns/faqs
Krunal Barot

それがあなたの意図したものである場合(SNS->複数のSQSキュー)、あなたの回答を編集してください。私は喜んで私の反対票を削除します。つまり、SQSはファンアウトする可能性があるようです。
Thales Minussi

1
はい..それは混乱があったところです。私はそれを編集しました..ありがとう:)
Krunal Barot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.