2015-12-29 8 views
8

Ich lese, Sie können mehrere Consumer-Apps pro Kinesis-Stream haben.mehrere Konsumenten pro Kinesis Shard

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

aber ich hörte, dass Sie nur auf Verbraucher pro Shard haben kann. Ist das wahr? Ich finde keine Dokumentation, die dies unterstützt, und ich kann mir nicht vorstellen, wie das sein könnte, wenn mehrere Verbraucher aus demselben Stream lesen. Natürlich bedeutet das nicht, dass der Produzent Inhalte in verschiedenen Shards für verschiedene Konsumenten wiederholen muss.

Antwort

10

Kinesis-Client-Bibliothek startet Threads im Hintergrund, jeder hört auf 1 Shard im Stream. Sie können keine Verbindung zu einem Shard über mehrere Threads herstellen, das ist By-Design.

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

Zum Beispiel, wenn Ihre Anwendung auf einer EC2-Instanz läuft, und verarbeitet ein Amazon Kinesis Strom, der vier Scherben hat. Diese Instanz hat einen KCL-Worker und vier Record-Prozessoren (ein Record Prozessor für jeden Shard). Diese vier Aufzeichnungsprozessoren laufen in parallel innerhalb desselben Prozesses.

In der obigen Erläuterung bezieht sich der Begriff "KCL-Worker" auf eine Kinesis-Consumer-Anwendung. Nicht die Fäden.

Aber unten bezieht sich der gleiche Begriff "KCL Worker" auf einen "Worker" -Thread in der Anwendung; was ist ein lauffähiges.

Normalerweise, wenn Sie die KCL verwenden, sollten Sie sicherstellen, dass die Anzahl der Instanzen nicht die Anzahl von Scherben nicht überschreitet (mit Ausnahme der Ausfall Standby-Zwecke). Jeder Shard wird von genau einem KCL-Arbeiter verarbeitet und hat genau einen entsprechenden Datensatzprozessor, so dass Sie nie mehrere Instanzen benötigen, um einen Shard zu verarbeiten.

Siehe die Worker.java Klasse in der KCL-Quelle.

+0

Ich verstehe jetzt. In diesem Fall sind sie, selbst wenn mehrere Instanzen vorhanden sind, dieselbe Clientanwendung. Ich dachte entlang der Linie von Kafka, wo unabhängige Anwendungen aus einem einzigen Stream lesen können. – bhomass

+2

@ user1058511: Sie können.Kinsis unterstützt den Anwendungsfall für mehrere Anwendungen, die denselben Stream gleichzeitig konsumieren. Beispielsweise haben Sie eine Anwendung, die ein Echtzeit-Dashboard aktualisiert, und eine andere, die Daten archiviert. Sie möchten, dass beide Anwendungen Daten aus demselben Stream gleichzeitig und unabhängig voneinander konsumieren. –

+0

Ich denke, ich muss neu formulieren. Im Fall von Kafka können die mehreren Verbraucher-Apps an einer Verbrauchergruppe teilnehmen, um eine Nachricht nicht wiederholt zu verarbeiten. In diesem Sinne möchte ich nicht "unabhängig" sagen, wie man "trennen" möchte. – bhomass

2

Spät in die Partei, aber die Antwort ist, dass Sie können mehrere Verbraucher pro Kinesis Shard haben. Eine KCL-Instanz wird nur einen Prozess pro Shard starten, aber Sie können eine andere KCL-Instanz den gleichen Stream (und Shard) verbrauchen, vorausgesetzt, der zweite hat die Berechtigung.

Es gibt Grenzen, aber in the docs wie angelegt, einschließlich:

Jede Scherbe bis 5 Transaktionen pro Sekunde unterstützen kann für liest, bis zu einer maximalen Gesamtdatenrate von 2 MB pro Sekunde gelesen .

Wenn Sie einen Stream mit mehreren Verbraucher wollen, wo jede Nachricht einmal verarbeitet wird, sind Sie wahrscheinlich besser dran, mit so etwas wie Amazon Simple Queue Service.

+1

Ich würde "einmal bearbeitet" bearbeiten, um "mindestens einmal verarbeitet" zu werden. In SQS können Sie nicht garantieren, dass eine Nachricht einmal verarbeitet wird. Sie erhalten mindestens einmal Verarbeitung: https://stackoverflow.com/questions/37472129/using-many-consumers-in-sqs-queue – skeller88

+0

Würden beide KCL-Instanzen erhalten die gleichen Daten oder würden z. die Daten werden über die EC2 Instanzen "round robined"? Ich suche nach einer Lösung, bei der der Konsument des Kinesis-Datenstroms ständig läuft, ohne auf einen anderen Server warten zu müssen, wenn einer ausfällt (z. B. indem zwei Server immer laufen, aber die Datensätze nicht doppelt verarbeitet werden) –

+0

Jeder Der Konsument erhält die gleichen Daten (verwaltet durch seinen Checkpointing) und kann sie unabhängig von einander in der von ihm gewünschten Geschwindigkeit konsumieren, ähnlich wie zwei Iteratoren. Sie sind nur durch ihre kombinierte Lesegrenze gekoppelt. Hier verhält sich Kinesis anders als AWS SQS (das effektiv einen einzelnen Iterator hat). –