Perché dovrei usare Amazon Kinesis e non SNS-SQS?


164

Ho un caso d'uso in cui ci sarà flusso di dati in arrivo e non posso consumarlo allo stesso ritmo e ho bisogno di un buffer. Questo può essere risolto usando una coda SNS-SQS. Sono venuto a sapere che Kinesis risolve lo stesso scopo, quindi qual è la differenza? Perché dovrei preferire (o non dovrei preferire) la Kinesis?

Risposte:


59

Sulla superficie sono vagamente simili, ma il tuo caso d'uso determinerà quale strumento è appropriato. IMO, se riesci a cavartela con SQS allora dovresti - se farà quello che vuoi, sarà più semplice ed economico, ma ecco una spiegazione migliore dalle FAQ di AWS che fornisce esempi di casi d'uso appropriati per entrambi gli strumenti per aiutarti a decidere:

FAQ



80

Tieni presente che questa risposta è stata corretta per giugno 2015

Dopo aver studiato il problema per un po ', avendo in mente la stessa domanda, ho scoperto che SQS (con SNS) è preferito per la maggior parte dei casi d'uso a meno che l'ordine dei messaggi non sia importante per te (SQS non garantisce FIFO sui messaggi).

Ci sono 2 principali vantaggi per Kinesis:

  1. puoi leggere lo stesso messaggio da diverse applicazioni
  2. puoi rileggere i messaggi in caso di necessità.

Entrambi i vantaggi possono essere raggiunti usando SNS come fan out per SQS. Ciò significa che il produttore del messaggio invia solo un messaggio a SNS, quindi SNS distribuisce il messaggio a più SQS, uno per ogni applicazione consumer. In questo modo puoi avere tutti i consumatori che vuoi senza pensare alla capacità di condivisione.

Inoltre, abbiamo aggiunto un altro SQ che è abbonato a SNS che conterrà i messaggi per 14 giorni. Nel caso normale nessuno legge da questo SQS ma in caso di un bug che ci fa desiderare di riavvolgere i dati possiamo facilmente leggere tutti i messaggi da questo SQS e rispedirli a SNS. Mentre Kinesis prevede solo una conservazione di 7 giorni.

In conclusione, SNS + SQS è molto più semplice e offre la maggior parte delle funzionalità. IMO hai bisogno di un caso davvero forte per scegliere Kinesis su di esso.


2
A proposito: puoi far conservare Kinesis per un massimo di 7 giorni.
Didier A.

30
Di recente, AWS ha annunciato SQS FIFO [ docs.aws.amazon.com/AWSSimpleQueueService/latest/… che può servire all'ordinamento temporale dei messaggi.
VijeshJain,

4
commento super minore - probabilmente non userebbe la parola splitin SNS split the message to multiple SQSsquanto non suddivide i messaggi in pezzi ma li copia in più destinazioni.
Mobigital,

2
Kinesis non è adatto per i casi d'uso fan-out (pub-sub) a causa delle limitazioni relative al numero di lettori per frammento / secondo. Sebbene non sia rilevante per l'indagine originale, chiunque si affidi al ridimensionamento di Kinesis per gli n-lettori dovrebbe prendere in considerazione questo fatto. forums.aws.amazon.com/message.jspa?messageID=760351
codeasone

2
La garanzia dell'ordine di Kinesis è per frammento, non per flusso. Una volta che hai più di un frammento, l'intero flusso non avrebbe alcuna garanzia sull'ordine. Per una coda SQS, quando la velocità effettiva è relativamente bassa, è quasi FIFO. Solo quando la velocità effettiva aumenta, l'ordine viene seguito meno. Ciò riguarda le classiche code SQS, non le code FIFO.
yoroto,

54

Kinesis supporta funzionalità di più consumatori, il che significa che gli stessi record di dati possono essere elaborati contemporaneamente o in momenti diversi entro 24 ore presso consumatori diversi, un comportamento simile in SQS può essere ottenuto scrivendo in più code e i consumatori possono leggere da più code. Tuttavia, la scrittura di nuovo in più code aggiungerà la latenza dei secondi secondari {pochi millisecondi} nel sistema.

In secondo luogo, Kinesis fornisce funzionalità di routing per indirizzare selettivamente i record di dati a diversi frammenti utilizzando la chiave di partizione che può essere elaborata da particolari istanze EC2 e può abilitare il calcolo di micro batch {Conteggio e aggregazione}.

Lavorare su qualsiasi software AWS è facile ma con SQS è il più semplice. Con Kinesis, è necessario eseguire il provisioning di frammenti sufficienti in anticipo, aumentando in modo dinamico il numero di frammenti per gestire il carico di picco e diminuirlo per risparmiare sui costi necessari anche per la gestione. è dolore in Kinesis, non sono necessarie cose del genere con SQS. SQS è scalabile all'infinito.


11
Per quanto riguarda la tua spiegazione sul SQS. È possibile ottenere un modo semplice per inviare lo stesso messaggio a più SQ avendo un SNS prima di essi.
Roee Gavirel,

8
app -> argomento sns ---> sqs1, sqs2, sqs3 ...?
kartik,

4
Sì, mi riferivo esattamente a questo approccio.
Roee Gavirel,

@RoeeGavirel per quanto riguarda le limitazioni di richiesta / secondo per sns api?
Barbaros Alp

@BarbarosAlp - Conosco solo la limitazione degli SMS (messaggi di testo mobili) che è fuori tema qui. questa è la documentazione ufficiale: docs.aws.amazon.com/general/latest/gr/…
Roee Gavirel,

43

La semantica di queste tecnologie è diversa perché progettata per supportare diversi scenari:

  • SNS / SQS: gli elementi nel flusso non sono correlati tra loro
  • Kinesis: gli elementi nel flusso sono correlati tra loro

Comprendiamo la differenza con l'esempio.

  1. Supponiamo di avere un flusso di ordini, per ogni ordine dobbiamo prenotare alcuni stock e pianificare una consegna. Una volta completato, possiamo rimuovere in sicurezza l'articolo dallo stream e iniziare l'elaborazione del prossimo ordine. Siamo pienamente finito con l'ordine precedente prima di iniziare la successiva.
  2. Ancora una volta, abbiamo lo stesso flusso di ordini, ma ora il nostro obiettivo è raggruppare gli ordini per destinazione. Una volta, diciamo, 10 ordini nello stesso posto, vogliamo consegnarli insieme (ottimizzazione della consegna). Ora la storia è diversa: quando otteniamo un nuovo oggetto dallo stream, non possiamo finire di elaborarlo; piuttosto "aspettiamo" che arrivino più articoli per raggiungere il nostro obiettivo. Inoltre, se il processo del processore si arresta in modo anomalo, dobbiamo "ripristinare" lo stato (quindi nessun ordine andrà perso).

Una volta che l'elaborazione di un articolo non può essere separata dall'elaborazione di un altro, è necessario disporre della semantica di Kinesis per gestire tutti i casi in modo sicuro.


Con la coda SQS FIFO, avremmo ordinato i messaggi mentre venivano inviati. Questo rende SQS simile a Kinesis su questo aspetto?
Andy Dufresne,

1
@AndyDufresne: questo copre bene lo scenario in cui l'ordine è importante. Nel caso (1) sopra, potresti voler gestire gli ordini "in ordine". Quindi, se esaurisci lo stock, gli ordini successivi vengono rifiutati o ritardati. La semantica FIFO non risolve il problema della relatività di base (raggruppamento).
Konstantin Triger,

35

Estratto dalla documentazione AWS :

Consigliamo Amazon Kinesis Streams per casi d'uso con requisiti simili ai seguenti:

  • Instradamento dei record correlati allo stesso processore di record (come nello streaming di MapReduce). Ad esempio, il conteggio e l'aggregazione sono più semplici quando tutti i record per una determinata chiave vengono instradati allo stesso processore di record.

  • Ordine dei record. Ad esempio, si desidera trasferire i dati del registro dall'host dell'applicazione all'host di elaborazione / archiviazione mantenendo l'ordine delle istruzioni del registro.

  • Possibilità per più applicazioni di utilizzare contemporaneamente lo stesso flusso. Ad esempio, hai un'applicazione che aggiorna una dashboard in tempo reale e un'altra che archivia i dati su Amazon Redshift. Si desidera che entrambe le applicazioni consumino dati dallo stesso flusso contemporaneamente e indipendentemente.

  • Possibilità di consumare registrazioni nello stesso ordine poche ore dopo. Ad esempio, hai un'applicazione di fatturazione e un'applicazione di controllo che viene eseguita alcune ore dietro l'applicazione di fatturazione. Poiché Amazon Kinesis Streams archivia i dati per un massimo di 7 giorni, è possibile eseguire l'applicazione di controllo fino a 7 giorni dopo l'applicazione di fatturazione.

Consigliamo Amazon SQS per casi d'uso con requisiti simili ai seguenti:

  • Semantica della messaggistica (come ack / fail a livello di messaggio) e timeout di visibilità. Ad esempio, si dispone di una coda di elementi di lavoro e si desidera tenere traccia del completamento corretto di ciascun elemento in modo indipendente. Amazon SQS tiene traccia di ack / fail, quindi l'applicazione non deve mantenere un checkpoint / cursore persistenti. Amazon SQS eliminerà i messaggi confermati e riconsegnerà i messaggi non riusciti dopo un timeout di visibilità configurato.

  • Ritardo messaggio individuale. Ad esempio, si dispone di una coda lavori e è necessario pianificare i singoli lavori con un ritardo. Con Amazon SQS, puoi configurare singoli messaggi in modo che abbiano un ritardo fino a 15 minuti.

  • Aumento dinamico della concorrenza / throughput al momento della lettura. Ad esempio, hai una coda di lavoro e desideri aggiungere altri lettori fino a quando il backlog non viene cancellato. Con Amazon Kinesis Streams, puoi scalare fino a un numero sufficiente di frammenti (nota, tuttavia, che dovrai fornire in anticipo abbastanza frammenti).

  • Sfruttando la capacità di Amazon SQS di ridimensionare in modo trasparente. Ad esempio, si bufferizzano le richieste e il carico cambia a seguito di picchi di carico occasionali o della crescita naturale della propria attività. Poiché ogni richiesta memorizzata può essere elaborata in modo indipendente, Amazon SQS può ridimensionare in modo trasparente per gestire il carico senza alcuna istruzione di provisioning.


34

Il vantaggio più grande per me è il fatto che Kinesis è una coda riproducibile e SQS no. Quindi puoi avere più consumatori degli stessi messaggi di Kinesis (o dello stesso consumatore in momenti diversi) in cui con SQS, una volta che un messaggio è stato intercettato, è passato da quella coda. SQS è meglio per le code dei lavoratori a causa di ciò.


Come accetti il ​​messaggio? Intendevi cancellare?
NeverEndingQueue

Sì, essenzialmente. Dicendo che hai finito con questo messaggio
Matthew Curry,

15

Un'altra cosa: Kinesis può innescare una Lambda, mentre SQS no. Quindi con SQS devi fornire un'istanza EC2 per elaborare i messaggi SQS (e gestirla se fallisce), oppure devi avere una Lambda programmata (che non si ingrandisce o diminuisce - ne ottieni solo una al minuto) .

Modifica: questa risposta non è più corretta. SQS può attivare direttamente Lambda a partire da giugno 2018

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


1
-1 Non sono d'accordo. Mentre Kinesis può innescare lambda, ciò non presenta alcun vantaggio rispetto a un lambda SQS sheduled. Quest'ultimo si ridimensionerà senza soluzione di continuità (ovvero se impiega più di un minuto a girare un secondo lambda). Il prezzo è per tempo di calcolo, quindi nessuna differenza apprezzabile neanche lì. E se hai bisogno di più di 5 lambda simultanei, aggiungi semplicemente più trigger pianificati a distanza di pochi secondi (usando cron). Questo non è un motivo per usare Kinesis su SNS / SQS.
Steven de Salas,

5
Non sono sicuro di essere d'accordo con il disaccordo;] - puoi programmare un lambda / minuto, il che ti limiterebbe a elaborare in batch i messaggi che sono arrivati ​​in quell'intervallo. Kinesis ti permetterebbe di leggere immediatamente i messaggi. O è qualcosa che ho frainteso?
Moszi

C'è un'enorme differenza tra un paio di trigger di cloudwatch e centinaia quando è necessario invocare il pull lambda contro SQS.
Coding Pig

14
Lambda ora supporta SQS come trigger!
sixty4bit

11

I modelli di prezzo sono diversi, quindi a seconda del caso d'uso l'uno o l'altro potrebbe essere più economico. Utilizzando il caso più semplice (escluso SNS):

  • Commissioni SQS per messaggio (ogni 64 KB conta come una richiesta).
  • Kinesis si carica per frammento all'ora (1 frammento può gestire fino a 1000 messaggi o 1 MB / secondo) e anche per la quantità di dati inseriti (ogni 25 KB).

Collegando i prezzi attuali e non tenendo conto del livello gratuito, se si inviano 1 GB di messaggi al giorno alla dimensione massima del messaggio, Kinesis costerà molto più di SQS ($ 10,82 / mese per Kinesis contro $ 0,20 / mese per SQS) . Ma se invii 1 TB al giorno, Kinesis è un po 'più economico ($ 158 / mese contro $ 201 / mese per SQS).

Dettagli: SQS addebita $ 0,40 per milione di richieste (64 KB ciascuno), quindi $ 0,00655 per GB. A 1 GB al giorno, questo è poco meno di $ 0,20 al mese; a 1 TB al giorno, arriva a poco più di $ 201 al mese.

Kinesis addebita $ 0,014 per milione di richieste (25 KB ciascuna), quindi $ 0,00059 per GB. A 1 GB al giorno, questo è inferiore a $ 0,02 al mese; a 1 TB al giorno, è di circa $ 18 al mese. Tuttavia, Kinesis addebita anche $ 0,015 all'ora di shard. Hai bisogno di almeno 1 frammento per 1 MB al secondo. Con 1 GB al giorno, 1 frammento sarà abbondante, quindi aggiungerai altri $ 0,36 al giorno, per un costo totale di $ 10,82 al mese. A 1 TB al giorno, avrai bisogno di almeno 13 frammenti, che aggiungono altri $ 4,68 al giorno, per un costo totale di $ 158 al mese.


Non seguo completamente il motivo per cui l'aumento esponenziale delle dimensioni, qui, è importante. Puoi scavare un po 'di più? Sembra che tu abbia qualche intuizione che mi piacerebbe avere. Modifica In realtà, guardando la risposta di Euguene Feingold, sembra esserci un dibattito piuttosto solido su questo (?).
Thomas,

Scusa, ho fatto alcuni errori nei miei calcoli (risolto ora, spero).
John Velonis,

giusto, ma cosa succede se la dimensione media dei messaggi SQS è piccola, diciamo 1kb o meno?
mcmillab,

1
@mcmillab SQS addebiterà lo stesso se il tuo messaggio è 1 KB o 64 KB - consulta la pagina dei prezzi di Amazon SQS . Quindi, se i tuoi messaggi sono solo 1 KB, SQS costerà 64 volte tanto quanto le cifre che ho dato sopra se stai inviando la stessa quantità totale di dati. Tuttavia, una singola richiesta può contenere fino a 10 messaggi, quindi se si è in grado di raggruppare i messaggi insieme, potrebbe essere solo 6 volte (a seconda di quanto siano completi i batch).
John Velonis,

1
@JohnVelonis Sopra i calcoli per i prezzi SQS mancano un pezzo chiave. È necessario prestare particolare attenzione per capire come vengono addebitate le richieste SQS. 1 richiesta = 1 azione API. Per elaborare un singolo "messaggio", è necessario eseguire almeno 3 azioni API: 1 invio + 1 lettura + 1 eliminazione. Altre funzionalità di SQS come la modifica della visibilità comporteranno più azioni API. Questo moltiplicatore inatteso è piuttosto brutto e in genere si traduce in SQS 2-10 volte più costoso di Kinesis Streams per grandi set di dati (ad esempio l'elaborazione di 100 milioni di messaggi al mese).
Vlad Poskatcheev,

9

Kinesis risolve il problema della parte della mappa in un tipico scenario di riduzione della mappa per lo streaming dei dati. Mentre SQS non ne è sicuro. Se si dispone di dati di streaming che devono essere aggregati su una chiave, kinesis si assicura che tutti i dati per quella chiave vadano su un frammento specifico e il frammento possa essere consumato su un singolo host rendendo l'aggregazione su chiave più semplice rispetto a SQS


5

Aggiungerò un'altra cosa che nessun altro ha menzionato: SQS è più costoso di molti ordini di grandezza.


3
Sei sicuro? Dal mio calcolo Kinesis è molto più costoso, ma non ho mai avuto talento usando il calcolatore semplice dei prezzi di Amazon.
Didier A.

Guardando gli attuali esempi di prezzi su aws: Kinesis con 267 milioni di messaggi è di circa $ 60, mentre l'inserimento di tale quantità di messaggi tramite SQS comporterebbe $ 107. Ovviamente ho appena fatto un confronto molto rapido, e questo differisce notevolmente con i diversi casi d'uso, ma questa risposta dovrebbe sicuramente meritare un po 'di credito.
Moszi

1
Supponiamo che stai facendo un fan per dire 2 consumatori e 100 milioni di messaggi al giorno. Il costo SNS è di $ 50 al giorno. Il costo SQS è $ 40 / giorno / consumatore o $ 80 / giorno totale. Kinesis è $ 1,4 / giorno per i PUT e $ 0,36 / shard. Anche con 100 frammenti (100 MB / s in entrata, 200 MB / s in uscita) costa solo $ 3,60 al giorno + $ 1,40 al giorno. Quindi Kinesis a $ 4 / giorno contro SNS / SQS a $ 130 / giorno.
Carlos Rendon,

@Moszi Come sei arrivato a questo calcolo? Una coda SQS standard con 15.000.000 di messaggi al mese e 10 GB di trasferimento dati in entrata e in uscita dati costa solo un misero 5,60 USD / mese, mentre un payload di 256 KB (SQS max) e ~ 15.000.000 unità PUT / mese (130 frammenti) in Kinesis costa 1.638,43 USD / mo.
simoncpu,

3
Sarei interessato a sapere perché c'è una disparità nei costi in questo thread.
Thomas,

2

Kinesis Use Cases

  • Raccolta dati registro ed eventi
  • Analisi in tempo reale
  • Acquisizione dati mobile
  • Feed di dati "Internet of Things"

SQS Use Cases

  • Integrazione delle applicazioni
  • Disaccoppiamento dei microservizi
  • Allocare attività a più nodi di lavoro
  • Disaccoppia le richieste degli utenti live da un intenso lavoro di background
  • Messaggi batch per elaborazioni future
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.