SNS-SQSではなくAmazon Kinesisを使用する必要があるのはなぜですか?


164

データのストリームが来て、同じペースで消費することができず、バッファーが必要になるユースケースがあります。これは、SNS-SQSキューを使用して解決できます。キネシスが同じ目的を解決することを知ったので、違いは何ですか?なぜKinesisを好む(または好まない)べきですか?

回答:


59

一見、それらは漠然と似ていますが、ユースケースによって適切なツールが決まります。IMO、SQSでうまくいく場合は、次のことを行う必要があります。必要な機能が得られれば、より簡単で安価になりますが、両方のツールの適切なユースケースの例を示すAWS FAQからのより良い説明は次のとおりです。あなたが決めるのを助けます:

よくある質問


7
FYI docs.aws.amazon.com/AWSSimpleQueueService/latest/... SQS FIFOはSNSでは動作しません
破壊し、すべて

80

この回答は2015年6月に正しかったことを覚えておいてください

同じ質問を念頭に置いてしばらく問題を調査した後、メッセージの順序が重要でない限り(SQSはメッセージのFIFOを保証しない)、SQS(SNS付き)がほとんどのユースケースに適していることがわかりました。

Kinesisには2つの主な利点があります。

  1. 複数のアプリケーションから同じメッセージを読むことができます
  2. 必要に応じてメッセージを読み直すことができます。

SNSをSQSへのファンアウトとして使用することで、両方の利点を実現できます。つまり、メッセージのプロデューサーは1つのメッセージのみをSNSに送信し、SNSはメッセージを複数のSQSにファンアウトします(各コンシューマーアプリケーションごとに1つ)。このようにして、シャーディング容量を考慮せずに、必要な数のコンシューマーを持つことができます。

さらに、メッセージを14日間保持するSNSに登録されているSQSを1つ追加しました。通常は誰もこのSQSから読み取ることはできませんが、データを巻き戻したいバグが発生した場合は、このSQSからすべてのメッセージを簡単に読み取ってSNSに再送信できます。Kinesisは7日間の保持のみを提供します。

結論として、SNS + SQSははるかに簡単で、ほとんどの機能を提供します。IMOあなたはそれよりもキネシスを選択するために本当に強力なケースが必要です。


2
参考:キネシスは最大7日間保持できます。
Didier A.

30
最近、AWSはSQS FIFO [ docs.aws.amazon.com/AWSSimpleQueueService/latest/…を発表しました。これはメッセージの時間順を提供できます。
VijeshJain 16

4
スーパーマイナーコメント- メッセージを断片化しないで複数の宛先にコピーするので、おそらく単語splitを使用しないでしょうSNS split the message to multiple SQSs
Mobigital 2017年

2
Kinesisは、シャード/秒あたりのリーダー数に制限があるため、ファンアウト(pub-sub)ユースケースには適していません。元の問い合わせとは関係ありませんが、nリーダーへのKinesisスケーリングに依存している人は、この事実を考慮に入れる必要があります。forums.aws.amazon.com/message.jspa?messageID=760351
codeasone

2
Kinesisの注文保証は、ストリームごとではなくシャードごとです。複数のシャードを取得すると、ストリーム全体の順序は保証されません。SQSキューの場合、スループットが比較的低いと、ほぼFIFOになります。スループットが高くなった場合にのみ、順序がたどられなくなります。これは、FIFOキューではなく、クラシックSQSキューに関するものです。
yoroto

54

Kinesisは複数のコンシューマー機能をサポートしています。つまり、同じデータレコードを異なるコンシューマーで24時間以内に同時に処理したり、別の時間に処理したりできます。SQSの同様の動作は、複数のキューに書き込み、コンシューマーは複数のキューから読み取ることができます。ただし、複数のキューに再度書き込むと、システムでサブ秒のレイテンシ(数ミリ秒)が追加されます。

第2に、Kinesisは、特定のEC2インスタンスで処理でき、マイクロバッチ計算を可能にするパーティションキーを使用して、データレコードを異なるシャードに選択的にルーティングするルーティング機能を提供します{カウントと集計}。

AWSソフトウェアでの作業は簡単ですが、SQSを使用するのが最も簡単です。Kinesisでは、事前に十分なシャードをプロビジョニングし、スパイク負荷を管理するために動的にシャード数を増やし、管理に必要なコストを節約するために減らす必要があります。それはキネシスの痛みです、SQSではそのようなことは必要ありません。SQSは無限にスケーラブルです。


11
SQSの説明について。複数のSQSの前にSNSを置くことで、同じメッセージを簡単に複数のSQSに送信できます。
Roee Gavirel

8
アプリ-> snsトピック---> sqs1、sqs2、sqs3 ...?
kartik 2015年

4
はい、私はまさにこのアプローチに言及していました。
Roee Gavirel、2015年

@RoeeGavirel SNS APIのリクエスト/秒制限についてはどうですか?
Barbaros Alp

@BarbarosAlp-私はSMS(モバイルテキストメッセージ)の制限のみを認識しています。これは、公式ドキュメントです:docs.aws.amazon.com/general/latest/gr/...
Roee Gavirel

43

これらのテクノロジーは、さまざまなシナリオをサポートするように設計されているため、セマンティクスは異なります。

  • SNS / SQS:ストリーム内のアイテムは互いに関連していません
  • キネシス:ストリーム内のアイテムがされている相互に関連し

例で違いを理解しましょう。

  1. 一連の注文があり、注文ごとに在庫を予約して配送をスケジュールする必要があるとします。これが完了すると、アイテムをストリームから安全に削除し、次の注文の処理を開始できます。次の注文を開始する前に、前の注文を完全に完了しました。
  2. 繰り返しになりますが、注文の流れは同じですが、目的は注文を目的地別にグループ化することです。たとえば、同じ場所に10件の注文が集まったら、それらを一緒に配送したい(配送の最適化)。ストーリーが異なります。ストリームから新しいアイテムを取得すると、処理を終了できません。むしろ、私たちは目標を達成するために、より多くのアイテムが来るのを待ちます。さらに、プロセッサプロセスがクラッシュした場合は、状態を「復元」する必要があります(したがって、順序が失われることはありません)。

1つのアイテムの処理を別のアイテムの処理から分離できない場合、すべてのケースを安全に処理するには、Kinesisセマンティクスが必要です。


SQS FIFOキューを使用すると、送信時にメッセージが順序付けされます。この点で、SQSはKinesisに似ていますか?
アンディDufresne

1
@AndyDufresne:これは、順序が重要なシナリオを適切にカバーします。上記のケース(1)では、注文を「順序どおりに」処理することができます。したがって、在庫がなくなった場合、それ以降の注文は拒否または遅延されます。FIFOセマンティクスは、コア相対性理論(グループ化)の問題を解決しません。
Konstantin Triger

35

AWSドキュメントからの抜粋:

次のような要件のユースケースには、Amazon Kinesis Streamsをお勧めします。

  • 関連するレコードを同じレコードプロセッサにルーティングする(ストリーミングMapReduceの場合と同様)。たとえば、特定のキーのすべてのレコードが同じレコードプロセッサにルーティングされる場合、カウントと集計はより簡単になります。

  • レコードの順序。たとえば、ログステートメントの順序を維持しながら、アプリケーションホストから処理/アーカイブホストにログデータを転送するとします。

  • 複数のアプリケーションが同じストリームを同時に消費する機能。たとえば、リアルタイムダッシュボードを更新するアプリケーションと、Amazon Redshiftにデータをアーカイブするアプリケーションがあります。両方のアプリケーションが同じストリームからのデータを同時にかつ独立して消費するようにします。

  • 数時間後に同じ順序でレコードを消費する機能。たとえば、請求アプリケーションと、請求アプリケーションの数時間遅れて実行される監査アプリケーションがあるとします。Amazon Kinesis Streamsは最大7日間データを保存するので、請求アプリケーションより最大7日間遅れて監査アプリケーションを実行できます。

次のような要件のユースケースには、Amazon SQSをお勧めします。

  • メッセージングのセマンティクス(メッセージレベルのack / failなど)と可視性のタイムアウト。たとえば、作業項目のキューがあり、各項目の正常な完了を個別に追跡したいとします。Amazon SQSはack / failを追跡するため、アプリケーションは永続的なチェックポイント/カーソルを維持する必要はありません。Amazon SQSは、構成された可視性タイムアウトの後で、確認されたメッセージを削除し、失敗したメッセージを再配信します。

  • 個々のメッセージの遅延。たとえば、ジョブキューがあり、個々のジョブを遅延してスケジュールする必要があるとします。Amazon SQSを使用すると、個々のメッセージを最大15分の遅延を持つように構成できます。

  • 読み取り時の並行性/スループットを動的に増加させます。たとえば、作業キューがあり、バックログがクリアされるまでリーダーを追加したいとします。Amazon Kinesis Streamsを使用すると、十分な数のシャードにスケールアップできます(ただし、事前に十分なシャードをプロビジョニングする必要があることに注意してください)。

  • 透過的にスケーリングするAmazon SQSの機能を活用します。たとえば、リクエストをバッファリングすると、時々発生するロードスパイクやビジネスの自然な成長の結果としてロードが変化します。バッファリングされた各リクエストは個別に処理できるため、Amazon SQSは透過的にスケーリングして、ユーザーからのプロビジョニングの指示なしで負荷を処理できます。


34

私にとっての最大の利点は、Kinesisは再生可能なキューであり、SQSはそうではないという事実です。そのため、Kinesisの同じメッセージの複数のコンシューマー(または異なる時点での同じコンシューマー)を持つことができます。SQSでは、メッセージが確認されると、そのキューから削除されます。そのため、SQSはワーカーキューに適しています。


メッセージをどのように確認しますか?削除するということですか?
NeverEndingQueue 2018

はい、本質的に。このメッセージが完了したと言う
マシューカリー

15

もう1つ:KinesisはLambdaをトリガーできますが、SQSはトリガーできません。そのため、SQSでは、EC2インスタンスを提供してSQSメッセージを処理する(および失敗した場合はそれに対処する)か、スケジュールされたLambda(スケールアップまたはスケールダウンせず、1分あたり1つしか取得しない)が必要です。 。

編集:この答えは正しくありません。2018年6月の時点で、SQSは直接Lambdaをトリガーできます

https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html


1
-1同意しない。Kinesisはラムダをトリガーすることができますが、これはシェッドされたSQSラムダに勝る利点はありません。後者はシームレスにスケーリングします(つまり、1分以上かかる場合、2番目のラムダがスピンアップします)。価格は計算時間あたりなので、そこにもそれほど大きな違いはありません。5つを超える同時ラムダが必要な場合は、数秒間隔でスケジュールされた複数のトリガーを追加します(cronを使用)。これは、SNS / SQSでKinesisを使用する理由ではありません。
Steven de Salas

5
私が意見の相違に同意するかどうかはわかりません;]-1ラムダ/分をスケジュールできます。Kinesisを使用すると、メッセージをすぐに読むことができます。それとも私が誤解したものですか?
Moszi 2017

SQSに対してプルラムダを呼び出す必要がある場合、2つのCloudwatchトリガーと数百のトリガーには大きな違いがあります。
Coding Pig

14
LambdaがトリガーとしてSQSをサポートするようになりました!
sixty4bit 2018年

11

価格モデルは異なるため、ユースケースに応じてどちらかが安くなる場合があります。最も単純なケース(SNSは含まない)を使用:

  • SQSはメッセージごとに課金します(各64 KBは1つの要求としてカウントされます)。
  • 1シャードあたり1時間あたりのKinesis料金(1シャードは最大1000メッセージまたは1 M​​B /秒を処理できます)と、入力したデータの量(25 KBごと)にも課金されます。

現在の料金を差し込み、無料枠を考慮せずに、最大メッセージサイズで1日あたり1 GBのメッセージを送信すると、KinesisはSQSよりもはるかに高くなります(Kinesisの場合は月額$ 10.82対SQSの場合は月額$ 0.20 /) 。ただし、1日あたり1 TBを送信する場合、Kinesisの方がいくらか安くなります(SQSの場合は月額$ 158に対して月額$ 158)。

詳細:SQSは、100万リクエスト(それぞれ64 KB)あたり$ 0.40を請求するため、GBあたり$ 0.00655です。1日あたり1 GBで、これは月額$ 0.20未満です。1日あたり1 TBで、1か月あたり201ドル強になります。

Kinesisは、100万リクエスト(各25 KB)あたり$ 0.014を請求するため、GBあたり$ 0.00059です。1日あたり1 GBで、これは月額$ 0.02未満です。1日あたり1 TBの場合、月額約18ドルです。ただし、Kinesisはシャード時間あたり$ 0.015も請求します。1 MB /秒あたり少なくとも1つのシャードが必要です。1日あたり1 GBの場合、1シャードで十分なので、1日あたり0.36ドルが追加され、1か月あたりの総コストは10.82ドルになります。1日あたり1 TBの場合、少なくとも13個のシャードが必要であり、これにより1日あたりさらに$ 4.68が追加され、合計コストは月あたり$ 158になります。


ここで、サイズの指数関数的な増加が重要である理由を完全には理解していません。もう少し掘り下げることができますか?あなたが私が知りたいと思う洞察を得たようです。編集実際には、Euguene Feingoldの回答を見ると、これについてかなりしっかりした議論があるようです(?)。
トーマス

申し訳ありませんが、計算に誤りを犯しました(今は修正済みです)。
ジョンベロニス2017

右ですが、SQSメッセージの平均サイズが小さい場合、たとえば1kb以下の場合はどうでしょうか。
mcmillab

1
@mcmillab SQSは、メッセージが1 KBでも64 KBでも同じように請求します。Amazon のSQS料金ページをご覧ください。したがって、メッセージが1 KBだけの場合、同じ合計量のデータを送信する場合、SQSのコストは上記の数値の64倍になります。ただし、1つのリクエストには最大10個のメッセージを含めることができるため、メッセージをまとめてバッチ処理できる場合、それは6倍に過ぎない場合があります(バッチがどの程度いっぱいかによって異なります)。
John Velonis

1
@JohnVelonis上記のSQS料金の計算には、重要な要素が欠けています。SQSリクエストがどのように課金されるかを理解するには、さらに注意が必要です。1リクエスト= 1 APIアクション。単一の「メッセージ」を処理するには、少なくとも3つのAPIアクションを実行する必要があります:1つの送信+ 1つの読み取り+ 1つの削除。可視性の変更などの他のSQS機能では、より多くのAPIアクションが発生します。この予想外の乗数は非常に厄介であり、通常、SQSは、大規模なデータセット(たとえば、1か月あたり1億のメッセージを処理する)の場合、Kinesis Streamsよりも2倍高くなります。
Vlad Poskatcheev

9

Kinesisは、ストリーミングデータの一般的なマップ削減シナリオでマップパーツの問題を解決します。SQSはそれを確認しませんが。キーで集約する必要があるストリーミングデータがある場合、キネシスにより、そのキーのすべてのデータが特定のシャードに送られ、シャードを単一のホストで消費できるため、SQSに比べてキーでの集約が容易になります。


5

他に誰も言及していないことをもう1つ追加します。SQSは数桁も高価です。


3
本気ですか?私の計算からは、Kinesisの方がはるかに高価ですが、Amazon Simple Price Calculatorを使用したことがありません。
Didier A.

awsの現在の価格設定の例を見ると、267MメッセージのKinesisは約60ドルですが、SQSを介してその量のメッセージを入れると、107ドルになります。明らかに、私は本当に簡単に比較しただけで、これはさまざまなユースケースで大きく異なりますが、この答えは間違いなくある程度の価値があるはずです。
Moszi 2017

1
たとえば、1日あたり2人の消費者と1億のメッセージをファンアウトしているとします。SNSの費用は1日あたり50ドルです。SQSのコストは、1日あたり40ドルまたは合計80ドルです。Kinesisは、PUTの場合は1日あたり1.4ドル、シャードは0.36ドルです。100シャード(100 MB /秒、200 MB /秒)でも、わずか$ 3.60 /日+ $ 1.40 /日です。つまり、Kinesisは1日4ドルで、SNS / SQSは1日130ドルです。
カルロスレンドン

@Mosziどうやってこの計算にたどり着いたのですか?1か月あたり15,000,000のメッセージと10 GBのデータ転送およびデータ転送を伴う標準のSQSキューのコストはわずか5.60USD /月ですが、Kinesisの256KBペイロード(最大SQS)と最大15,000,000 PUTユニット/月(130シャード)のコストは1,638.43です。 USD /月。
simoncpu 2017

3
このスレッドでコストにこのような差がある理由を知りたいと思います。
トーマス

2

キネシスのユースケース

  • ログとイベントデータの収集
  • リアルタイム分析
  • モバイルデータキャプチャ
  • 「モノのインターネット」データフィード

SQSの使用例

  • アプリケーション統合
  • マイクロサービスの分離
  • 複数のワーカーノードにタスクを割り当てる
  • 集中的なバックグラウンド作業からライブユーザーの要求を切り離す
  • 今後の処理のためのバッチメッセージ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.