Warum sollte ich Amazon Kinesis und nicht SNS-SQS verwenden?


164

Ich habe einen Anwendungsfall, in dem Datenströme kommen, und ich kann sie nicht im gleichen Tempo verbrauchen und benötige einen Puffer. Dies kann mithilfe einer SNS-SQS-Warteschlange gelöst werden. Ich habe erfahren, dass die Kinesis denselben Zweck löst. Was ist also der Unterschied? Warum sollte ich Kinesis bevorzugen (oder nicht bevorzugen)?

Antworten:


59

An der Oberfläche sind sie sich vage ähnlich, aber Ihr Anwendungsfall bestimmt, welches Werkzeug geeignet ist. IMO, wenn Sie mit SQS auskommen können, sollten Sie - wenn es das tut, was Sie wollen, wird es einfacher und billiger, aber hier ist eine bessere Erklärung aus den AWS-FAQ, die Beispiele für geeignete Anwendungsfälle für beide Tools enthält helfen Ihnen bei der Entscheidung:

FAQs



80

Beachten Sie, dass diese Antwort für Juni 2015 korrekt war

Nachdem ich das Problem eine Weile untersucht hatte und dieselbe Frage im Auge hatte, stellte ich fest, dass SQS (mit SNS) für die meisten Anwendungsfälle bevorzugt wird, es sei denn, die Reihenfolge der Nachrichten ist für Sie wichtig (SQS garantiert kein FIFO für Nachrichten).

Kinesis bietet zwei Hauptvorteile:

  1. Sie können dieselbe Nachricht aus mehreren Anwendungen lesen
  2. Sie können Nachrichten bei Bedarf erneut lesen.

Beide Vorteile können durch die Verwendung von SNS als Fan-Out für SQS erzielt werden. Dies bedeutet, dass der Produzent der Nachricht nur eine Nachricht an SNS sendet. Anschließend fächert der SNS die Nachricht an mehrere SQSs auf, eine für jede Verbraucheranwendung. Auf diese Weise können Sie so viele Verbraucher haben, wie Sie möchten, ohne über die Sharding-Kapazität nachzudenken.

Darüber hinaus haben wir einen weiteren SQS hinzugefügt, der den SNS abonniert hat und 14 Tage lang Nachrichten enthält. Im Normalfall liest niemand von diesem SQS, aber im Falle eines Fehlers, der uns dazu bringt, die Daten zurückzuspulen, können wir problemlos alle Nachrichten von diesem SQS lesen und erneut an den SNS senden. Während Kinesis nur eine 7-tägige Aufbewahrung bietet.

Zusammenfassend ist SNS + SQS viel einfacher und bietet die meisten Funktionen. IMO brauchen Sie einen wirklich starken Fall, um Kinesis darüber zu wählen.


2
Zu Ihrer Information: Sie können Kinesis bis zu 7 Tage aufbewahren lassen.
Didier A.

30
Vor kurzem hat AWS SQS FIFO [ docs.aws.amazon.com/AWSSimpleQueueService/latest/… angekündigt, das die zeitliche Reihenfolge von Nachrichten ermöglichen kann.
VijeshJain

4
Super - Moll-Kommentar - wahrscheinlich das Wort nicht verwenden würde splitin SNS split the message to multiple SQSsda sie Nachrichten in Stücke nicht abreißt , sondern kopiert sie an mehrere Ziele.
Mobigital

2
Kinesis ist aufgrund von Einschränkungen hinsichtlich der Anzahl der Leser pro Shard / Sekunde nicht für Fan-Out-Anwendungsfälle (Pub-Sub) geeignet. Obwohl dies für die ursprüngliche Anfrage nicht relevant ist, sollte jeder, der sich auf die Kinesis-Skalierung für n-Reader verlässt, diese Tatsache berücksichtigen. forums.aws.amazon.com/message.jspa?messageID=760351
Codeasone

2
Die Bestellgarantie von Kinesis gilt pro Shard und nicht pro Stream. Sobald Sie mehr als einen Shard haben, hat der gesamte Stream keine Garantie für die Bestellung. Wenn für eine SQS-Warteschlange der Durchsatz relativ niedrig ist, ist er fast FIFO. Nur wenn Ihr Durchsatz höher ist, wird die Reihenfolge weniger eingehalten. Dies betrifft klassische SQS-Warteschlangen, keine FIFO-Warteschlangen.
Yoroto

54

Kinesis unterstützt Funktionen für mehrere Verbraucher, dh, dieselben Datensätze können zur gleichen Zeit oder zu unterschiedlichen Zeiten innerhalb von 24 Stunden bei verschiedenen Verbrauchern verarbeitet werden. Ein ähnliches Verhalten in SQS kann durch Schreiben in mehrere Warteschlangen erreicht werden, und Verbraucher können aus mehreren Warteschlangen lesen. Wenn Sie jedoch erneut in mehrere Warteschlangen schreiben, wird die Latenz im System um einige Sekunden (einige Millisekunden) verlängert.

Zweitens bietet Kinesis Routing-Funktionen zum selektiven Weiterleiten von Datensätzen an verschiedene Shards mithilfe eines Partitionsschlüssels, der von bestimmten EC2-Instanzen verarbeitet werden kann und die Berechnung von Mikrobatches {Counting & Aggregation} ermöglicht.

Die Arbeit an jeder AWS-Software ist einfach, mit SQS jedoch am einfachsten. Bei Kinesis müssen im Voraus genügend Shards bereitgestellt werden, wodurch die Anzahl der Shards dynamisch erhöht wird, um die Spitzenlast zu verwalten, und verringert werden muss, um Kosten zu sparen, die auch für die Verwaltung erforderlich sind. Es ist Schmerz in Kinesis. Bei SQS sind solche Dinge nicht erforderlich. SQS ist unendlich skalierbar.


11
In Bezug auf Ihre Erklärung zum SQS. Sie können auf einfache Weise dieselbe Nachricht an mehrere SQS senden, indem Sie einen SNS vor sich haben.
Roee Gavirel

8
App -> sns Thema ---> sqs1, sqs2, sqs3 ...?
Kartik

4
Ja, ich habe mich genau auf diesen Ansatz bezogen.
Roee Gavirel

@RoeeGavirel was ist mit der Anfrage / Sekunde Einschränkungen für sns API?
Barbaros Alp

@BarbarosAlp - Mir ist nur die Einschränkung von SMS (Mobile Text Messages) bekannt, die hier nicht zum Thema gehört. Dies ist die offizielle Dokumentation: docs.aws.amazon.com/general/latest/gr/…
Roee Gavirel

43

Die Semantik dieser Technologien ist unterschiedlich, da sie unterschiedliche Szenarien unterstützen sollen:

  • SNS / SQS: Die Elemente im Stream sind nicht miteinander verbunden
  • Kinesis: Die Elemente im Stream sind miteinander verknüpft

Lassen Sie uns den Unterschied anhand eines Beispiels verstehen.

  1. Angenommen, wir haben einen Strom von Bestellungen. Für jede Bestellung müssen wir Lagerbestände reservieren und eine Lieferung planen. Sobald dies abgeschlossen ist, können wir den Artikel sicher aus dem Stream entfernen und mit der Bearbeitung der nächsten Bestellung beginnen. Wir sind mit der vorherigen Bestellung vollständig fertig , bevor wir mit der nächsten beginnen.
  2. Wir haben wieder den gleichen Auftragsstrom, aber jetzt ist es unser Ziel, Aufträge nach Zielen zu gruppieren. Sobald wir beispielsweise 10 Bestellungen am selben Ort haben, möchten wir diese zusammen liefern (Lieferoptimierung). Jetzt ist die Geschichte anders: Wenn wir ein neues Element aus dem Stream erhalten, können wir es nicht fertig verarbeiten. Vielmehr "warten" wir auf weitere Artikel, um unser Ziel zu erreichen. Wenn der Prozessorprozess abstürzt, müssen wir außerdem den Status "wiederherstellen" (damit keine Ordnung verloren geht).

Sobald die Verarbeitung eines Elements nicht von der Verarbeitung eines anderen getrennt werden kann, müssen wir über eine Kinesis-Semantik verfügen, um alle Fälle sicher behandeln zu können.


Mit der SQS-FIFO-Warteschlange würden wir die Nachrichten so bestellen, wie sie gesendet werden. Ist SQS in diesem Punkt Kinesis ähnlich?
Andy Dufresne

1
@AndyDufresne: Dies deckt das Szenario gut ab, in dem die Reihenfolge wichtig ist. Im obigen Fall (1) möchten Sie möglicherweise Bestellungen "in der richtigen Reihenfolge" bearbeiten. Wenn Ihnen der Vorrat ausgeht, werden spätere Bestellungen abgelehnt oder verzögert. Die FIFO-Semantik löst das Kernproblem der Relativitätstheorie (Gruppierung) nicht.
Konstantin Triger

35

Auszug aus der AWS-Dokumentation :

Wir empfehlen Amazon Kinesis Streams für Anwendungsfälle mit ähnlichen Anforderungen:

  • Weiterleiten verwandter Datensätze an denselben Datensatzprozessor (wie beim Streaming von MapReduce). Das Zählen und Aggregieren ist beispielsweise einfacher, wenn alle Datensätze für einen bestimmten Schlüssel an denselben Datensatzprozessor weitergeleitet werden.

  • Bestellung von Aufzeichnungen. Beispielsweise möchten Sie Protokolldaten vom Anwendungshost auf den Verarbeitungs- / Archivierungshost übertragen, während Sie die Reihenfolge der Protokollanweisungen beibehalten.

  • Möglichkeit für mehrere Anwendungen, denselben Stream gleichzeitig zu verwenden. Sie haben beispielsweise eine Anwendung, die ein Echtzeit-Dashboard aktualisiert, und eine andere, die Daten in Amazon Redshift archiviert. Sie möchten, dass beide Anwendungen gleichzeitig und unabhängig voneinander Daten aus demselben Stream verwenden.

  • Möglichkeit, einige Stunden später Datensätze in derselben Reihenfolge zu verwenden. Sie haben beispielsweise eine Abrechnungsanwendung und eine Überwachungsanwendung, die einige Stunden hinter der Abrechnungsanwendung ausgeführt werden. Da Amazon Kinesis Streams Daten bis zu 7 Tage speichert, können Sie die Überwachungsanwendung bis zu 7 Tage hinter der Abrechnungsanwendung ausführen.

Wir empfehlen Amazon SQS für Anwendungsfälle mit ähnlichen Anforderungen:

  • Messaging-Semantik (z. B. Bestätigung / Fehler auf Nachrichtenebene) und Zeitlimit für Sichtbarkeit. Sie haben beispielsweise eine Warteschlange mit Arbeitselementen und möchten den erfolgreichen Abschluss jedes Elements unabhängig verfolgen. Amazon SQS verfolgt die Bestätigung / den Fehler, sodass die Anwendung keinen dauerhaften Prüfpunkt / Cursor verwalten muss. Amazon SQS löscht bestätigte Nachrichten und liefert fehlgeschlagene Nachrichten nach einem konfigurierten Zeitlimit für die Sichtbarkeit erneut.

  • Verzögerung einzelner Nachrichten. Sie haben beispielsweise eine Jobwarteschlange und müssen einzelne Jobs verzögert planen. Mit Amazon SQS können Sie einzelne Nachrichten mit einer Verzögerung von bis zu 15 Minuten konfigurieren.

  • Dynamisch steigende Parallelität / Durchsatz zum Zeitpunkt des Lesens. Sie haben beispielsweise eine Arbeitswarteschlange und möchten weitere Leser hinzufügen, bis das Backlog gelöscht ist. Mit Amazon Kinesis Streams können Sie auf eine ausreichende Anzahl von Shards skalieren (beachten Sie jedoch, dass Sie im Voraus genügend Shards bereitstellen müssen).

  • Nutzung der Fähigkeit von Amazon SQS, transparent zu skalieren. Beispielsweise puffern Sie Anforderungen und die Last ändert sich aufgrund gelegentlicher Lastspitzen oder des natürlichen Wachstums Ihres Unternehmens. Da jede gepufferte Anforderung unabhängig verarbeitet werden kann, kann Amazon SQS transparent skaliert werden, um die Last ohne Bereitstellungsanweisungen von Ihnen zu bewältigen.


34

Der größte Vorteil für mich ist die Tatsache, dass Kinesis eine wiederholbare Warteschlange ist und SQS nicht. Sie können also mehrere Konsumenten derselben Nachrichten von Kinesis (oder denselben Konsumenten zu unterschiedlichen Zeiten) haben, wobei mit SQS eine Nachricht aus dieser Warteschlange entfernt wurde, sobald sie bestätigt wurde. Aus diesem Grund ist SQS besser für Worker-Warteschlangen geeignet.


Wie bestätigen Sie die Nachricht? Meinten Sie löschen?
NeverEndingQueue

Ja, im Wesentlichen. Zu sagen, dass Sie mit dieser Nachricht fertig sind
Matthew Curry

15

Eine andere Sache: Kinesis kann ein Lambda auslösen, SQS nicht. Bei SQS müssen Sie entweder eine EC2-Instanz bereitstellen, um SQS-Nachrichten zu verarbeiten (und diese zu verarbeiten, wenn dies fehlschlägt), oder Sie müssen einen geplanten Lambda haben (der nicht vergrößert oder verkleinert wird - Sie erhalten nur einen pro Minute). .

Bearbeiten: Diese Antwort ist nicht mehr korrekt. SQS kann Lambda ab Juni 2018 direkt auslösen

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


1
-1 Nicht einverstanden. Während Kinesis Lambda auslösen kann, ist dies kein Vorteil gegenüber einem geplanten SQS-Lambda. Letzteres lässt sich nahtlos skalieren (dh wenn es länger als eine Minute dauert, wird ein zweites Lambda hochgefahren). Der Preis ist pro Rechenzeit, also auch dort kein nennenswerter Unterschied. Und wenn Sie mehr als 5 gleichzeitige Lambdas benötigen, fügen Sie einfach mehrere Trigger hinzu, die im Abstand von einigen Sekunden geplant sind (mit cron). Dies ist kein Grund, Kinesis über SNS / SQS zu verwenden.
Steven de Salas

5
Ich bin mir nicht sicher, ob ich mit der Meinungsverschiedenheit einverstanden bin;] - Sie können ein Lambda / Minute einplanen, wodurch Sie die Nachrichten, die in diesem Intervall eingetroffen sind, stapelweise verarbeiten können. Mit Kinesis können Sie die Nachrichten sofort lesen. Oder habe ich etwas falsch verstanden?
Moszi

Es gibt einen großen Unterschied zwischen ein paar Cloudwatch-Triggern und Hunderten, wenn das ziehende Lambda gegen SQS aufgerufen werden muss.
Coding Pig

14
Lambda unterstützt jetzt SQS als Trigger!
Sixty4bit

11

Die Preismodelle sind unterschiedlich, sodass je nach Anwendungsfall das eine oder andere möglicherweise günstiger ist. Verwenden Sie den einfachsten Fall (ohne SNS):

  • SQS-Gebühren pro Nachricht (jede 64 KB zählt als eine Anforderung).
  • Kinesis berechnet pro Shard pro Stunde (1 Shard kann bis zu 1000 Nachrichten oder 1 MB / Sekunde verarbeiten) und auch für die von Ihnen eingegebene Datenmenge (alle 25 KB).

Wenn Sie die aktuellen Preise eingeben und die kostenlose Stufe nicht berücksichtigen und 1 GB Nachrichten pro Tag mit der maximalen Nachrichtengröße senden, kostet Kinesis viel mehr als SQS (10,82 USD / Monat für Kinesis gegenüber 0,20 USD / Monat für SQS). . Wenn Sie jedoch 1 TB pro Tag senden, ist Kinesis etwas billiger (158 USD / Monat gegenüber 201 USD / Monat für SQS).

Details: SQS berechnet 0,40 USD pro Million Anfragen (jeweils 64 KB), also 0,00655 USD pro GB. Bei 1 GB pro Tag sind dies knapp 0,20 USD pro Monat. Bei 1 TB pro Tag sind es etwas mehr als 201 US-Dollar pro Monat.

Kinesis berechnet 0,014 USD pro Million Anfragen (jeweils 25 KB), also 0,00059 USD pro GB. Bei 1 GB pro Tag sind dies weniger als 0,02 USD pro Monat. Bei 1 TB pro Tag sind es ungefähr 18 US-Dollar pro Monat. Kinesis berechnet jedoch auch 0,015 USD pro Shard-Stunde. Sie benötigen mindestens 1 Shard pro 1 MB pro Sekunde. Bei 1 GB pro Tag ist 1 Shard ausreichend, sodass weitere 0,36 USD pro Tag hinzukommen, was einem Gesamtpreis von 10,82 USD pro Monat entspricht. Bei 1 TB pro Tag benötigen Sie mindestens 13 Shards, was weitere 4,68 USD pro Tag ergibt, was einem Gesamtpreis von 158 USD pro Monat entspricht.


Ich verfolge nicht ganz, warum die exponentielle Zunahme der Größe hier wichtig ist. Können Sie ein bisschen mehr graben? Es hört sich so an, als hätten Sie einen Einblick, den ich gerne hätte. Bearbeiten Wenn man sich die Antwort von Euguene Feingold ansieht, scheint es tatsächlich eine ziemlich solide Debatte darüber zu geben (?).
Thomas

Entschuldigung, ich habe einige Fehler in meinen Berechnungen gemacht (jetzt hoffentlich behoben).
John Velonis

Richtig, aber was ist, wenn Ihre durchschnittliche SQS-Nachrichtengröße klein ist, z. B. 1 KB oder weniger?
Mcmillab

1
@mcmillab SQS berechnet die gleiche Gebühr, unabhängig davon, ob Ihre Nachricht 1 KB oder 64 KB groß ist - siehe die SQS- Preisseite von Amazon . Wenn Ihre Nachrichten also nur 1 KB groß sind, kostet SQS das 64-fache der oben angegebenen Zahlen, wenn Sie dieselbe Gesamtdatenmenge senden. Eine einzelne Anforderung kann jedoch bis zu 10 Nachrichten enthalten. Wenn Sie also Nachrichten zusammen stapeln können, ist sie möglicherweise nur 6x so groß (abhängig davon, wie voll Ihre Stapel sind).
John Velonis

1
@ JohnVelonis Bei den obigen Berechnungen für die SQS-Preisgestaltung fehlt ein Schlüsselelement. Es ist besondere Sorgfalt erforderlich, um zu verstehen, wie SQS-Anforderungen berechnet werden. 1 Anfrage = 1 API-Aktion. Um eine einzelne "Nachricht" zu verarbeiten, müssen mindestens 3 API-Aktionen ausgeführt werden: 1 Senden + 1 Lesen + 1 Löschen. Andere SQS-Funktionen wie das Ändern der Sichtbarkeit führen zu mehr API-Aktionen. Dieser unerwartete Multiplikator ist ziemlich unangenehm und führt normalerweise dazu, dass SQS für große Datenmengen (z. B. die Verarbeitung von 100 Millionen Nachrichten pro Monat) 2-10x teurer ist als Kinesis Streams.
Vlad Poskatcheev

9

Kinesis löst das Problem des Kartenteils in einem typischen Szenario zur Kartenreduzierung für das Streaming von Daten. Während SQS dies nicht sicherstellt. Wenn Sie Streaming-Daten haben, die auf einem Schlüssel aggregiert werden müssen, stellt kinesis sicher, dass alle Daten für diesen Schlüssel zu einem bestimmten Shard gehen und der Shard auf einem einzelnen Host verwendet werden kann, was die Aggregation auf dem Schlüssel im Vergleich zu SQS vereinfacht


5

Ich werde noch etwas hinzufügen, das noch niemand erwähnt hat - SQS ist um mehrere Größenordnungen teurer.


3
Bist du sicher? Nach meiner Berechnung ist Kinesis viel teurer, aber ich war noch nie mit dem Amazon Simple Price Calculator talentiert.
Didier A.

Betrachten Sie die aktuellen Preisbeispiele für aws: Kinesis mit 267 Millionen Nachrichten kostet etwa 60 US-Dollar, während die Übermittlung dieser Nachrichtenmenge über SQS 107 US-Dollar ergeben würde. Natürlich habe ich nur einen sehr schnellen Vergleich durchgeführt, und dies unterscheidet sich stark von verschiedenen Anwendungsfällen, aber diese Antwort sollte definitiv etwas Anerkennung verdienen.
Moszi

1
Angenommen, Sie machen einen Fan, um 2 Verbraucher und 100 Millionen Nachrichten pro Tag zu sagen. Die SNS-Kosten betragen 50 USD / Tag. Die SQS-Kosten betragen 40 USD / Tag / Verbraucher oder insgesamt 80 USD / Tag. Kinesis kostet $ 1,4 / Tag für PUTs und $ 0,36 / Shard. Selbst mit 100 Shards (100 MB / s rein, 200 MB / s raus) sind es nur 3,60 $ / Tag + 1,40 $ / Tag. Also Kinesis bei 4 $ / Tag gegen SNS / SQS bei 130 $ / Tag.
Carlos Rendon

@ Moszi Wie bist du zu dieser Berechnung gekommen? Eine Standard-SQS-Warteschlange mit 15.000.000 Nachrichten pro Monat und 10 GB Datenübertragung und -übertragung kostet nur 5,60 USD / Monat, während eine Nutzlast von 256 KB (max. SQS) und ~ 15.000.000 PUT-Einheiten / Monat (130 Shards) in Kinesis 1.638,43 kostet USD / Monat
Simoncpu

3
Es würde mich interessieren, warum es in diesem Thread so unterschiedliche Kosten gibt.
Thomas

2

Kinesis-Anwendungsfälle

  • Protokoll- und Ereignisdatenerfassung
  • Echtzeitanalyse
  • Mobile Datenerfassung
  • Daten-Feed „Internet der Dinge“

SQS-Anwendungsfälle

  • Anwendungsintegration
  • Mikrodienste entkoppeln
  • Ordnen Sie Aufgaben mehreren Arbeitsknoten zu
  • Entkoppeln Sie Live-Benutzeranforderungen von intensiver Hintergrundarbeit
  • Stapelnachrichten für die zukünftige Verarbeitung
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.