2015-12-29 20 views
8

Ho letto che è possibile avere più app consumer per flusso kinesis.più utenti per cesoia cinesica

http://docs.aws.amazon.com/kinesis/latest/dev/developing-consumers-with-kcl.html

però, ho sentito che si può avere solo sul consumatore per shard. È vero? Non trovo documentazione per supportare questo e non riesco a immaginare come potrebbe accadere se più utenti leggono dallo stesso stream. Certamente, non significa che il produttore debba ripetere il contenuto in diversi frammenti per diversi consumatori.

risposta

10

Kinesis Client Library avvia i thread in background, ciascuno ascolta 1 frammento nello stream. Non è possibile connettersi a un frammento su più thread, ovvero by-design.

http://docs.aws.amazon.com/kinesis/latest/dev/kinesis-record-processor-scaling.html

Ad esempio, se l'applicazione è in esecuzione su un'istanza EC2, e sta elaborando un flusso Amazon Kinesis che ha quattro frammenti. Questa istanza di ha un operatore KCL e quattro processori di registrazione (un processore record per ogni frammento). Questi quattro processori di registrazione funzionano nello stesso parallelo.

Nella spiegazione sopra, il termine "lavoratore KCL" si riferisce a un'applicazione consumer Kinesis. Non i fili.

Tuttavia, lo stesso termine "KCL worker" si riferisce a un thread "Worker" nell'applicazione; che è una corsa.

In genere, quando si utilizza il KCL, è necessario assicurarsi che il numero di istanze non superi il numero di frammenti (tranne che per guasto fini di standby). Ogni frammento è elaborato esattamente da un operatore KCL e ha esattamente un processore di record corrispondente, quindi non è necessario più istanze per elaborare uno shard .

Vedere la classe Worker.java nella sorgente KCL.

+0

Capisco ora. In questo caso, anche se ci sono più istanze, sono la stessa applicazione client. Stavo pensando lungo la linea di kafka, dove le applicazioni indipendenti possono leggere da un singolo flusso. – bhomass

+2

@ user1058511: È possibile.Kinsis supporta il caso d'uso per più applicazioni per consumare contemporaneamente lo stesso flusso. Ad esempio, si dispone di un'applicazione che aggiorna una dashboard in tempo reale e un'altra che archivia i dati. Si desidera che entrambe le applicazioni consumino i dati dallo stesso flusso contemporaneamente e in modo indipendente. –

+0

Penso di aver bisogno di riformulare. In caso di Kafka, le app multiple consumer possono partecipare a un gruppo di consumatori per non elaborare ripetutamente nessun messaggio. In questo senso, non voglio dire "indipendente" come supponiamo di "separare". – bhomass

2

In ritardo alla festa, ma la risposta è che si può può avere più consumatori per shard cinesis. Un'istanza KCL sarà avvia solo un processo per frammento, ma è possibile avere un'altra istanza KCL che utilizza lo stesso flusso (e frammento), assumendo che il secondo abbia il permesso.

Non ci sono limiti, anche se, come stabilito nella the docs, tra cui:

Ogni frammento può supportare fino a 5 transazioni al secondo per legge, fino a un dato massimi totali LEGGI velocità di 2 MB al secondo .

Se si desidera uno streaming con più utenti in cui ogni messaggio verrà elaborato una volta, è preferibile utilizzare qualcosa come Amazon Simple Queue Service.

+1

Vorrei modificare "elaborato una volta" per essere "elaborato almeno una volta". In SQS, non è garantito che un messaggio verrà elaborato una volta. Otterrai almeno una volta l'elaborazione: https://stackoverflow.com/questions/37472129/using-many-consumers-in-sqs-queue – skeller88

+0

Entrambe le istanze di KCL ottengono gli stessi dati o, ad es. i dati sono "arrotondati" attraverso le istanze EC2? Sto cercando una soluzione in cui il consumatore di Kinesis Data Stream sia costantemente in esecuzione senza dover attendere l'avvio di un altro server se si scende (ad esempio avendo due server sempre in esecuzione, ma evitando di elaborare i record due volte) –

+0

Ciascuno il consumatore ottiene gli stessi dati (gestiti dal suo checkpoint) e può consumarlo a qualsiasi velocità, indipendentemente l'uno dall'altro, come se avessero due iteratori. Sono solo accoppiati dal loro limite di lettura combinato. È qui che Kinesis si comporta diversamente con AWS SQS (che ha effettivamente un singolo iteratore). –