2017-03-26 5 views
1

Wie kann man einen Verbraucher schreiben, der mehrere Kafka-Themen in einer skalierbaren Weise verbindet?Mehrere Kafka-Themen mit Schlüssel verknüpfen

Ich habe ein Thema, das Ereignisse mit einem Schlüssel und einem zweiten Thema veröffentlicht, die andere Ereignisse im Zusammenhang mit einer Teilmenge der ersten mit dem gleichen Schlüssel veröffentlicht. Ich möchte einen Verbraucher schreiben, der beide Themen abonniert und zusätzliche Aktionen für die Teilmenge ausführt, die in beiden Themen enthalten ist.

Ich kann dies leicht mit einem einzigen Verbraucher tun: Lesen Sie alles aus beiden Themen, Zustand lokal zu halten und die Aktionen durchzuführen, wenn beide Ereignisse für einen bestimmten Schlüssel gelesen wurden. Aber ich brauche die Lösung, um zu skalieren.

Idealerweise muss ich die Zweige verknüpfen, damit sie auf die gleiche Weise partitioniert werden und die Partitionen den Benutzern synchron zugewiesen werden. Wie kann ich das machen?

Ich weiß Kafka Streams verbindet Themen miteinander, so dass Schlüssel zu den gleichen Knoten zugeordnet sind. Wie machen Sie das? P.S. Ich kann Kafka Streams nicht verwenden, weil ich Python verwende.

+0

Spark-Streaming ist auch ein gangbarer Weg. –

Antwort

2

Schade, dass Sie auf Python sind - Kafka Streams wäre eine perfekte Passform sein :)

Wenn Sie dies manuell tun wollen, müssen Sie Ihre eigene implementieren PartitionAssignor - dies muss Umsetzung gewährleisten, dass Partitionen befinden sich in der Zuweisung: Nehmen wir an, Sie haben 4 Partitionen pro Thema (nennen wir sie A und B), dann müssen die Partitionen A_0 und B_0 demselben Consumer zugeordnet werden (auch A_1 und B_1, ...).

Ich hoffe, Python Consumer können Sie einen benutzerdefinierten Partition Assignor über Config-Parameter partition.assignment.strategy angeben.

Dies ist der PartitionAssignor Kafka Streams verwendet: https://github.com/apache/kafka/blob/trunk/streams/src/main/java/org/apache/kafka/streams/processor/internals/StreamPartitionAssignor.java

Streams verwendet das Konzept der Aufgaben - ein Aufgabe bekommt Partitionen von verschiedenen Themen mit der gleichen Partition Nummer zugewiesen. Streams versucht auch, eine "sticky assignment" zu erstellen, dh, wenn möglich, die Aufgabe (und damit die Partitionen) nicht zu verschieben. Somit codiert jeder Verbraucher seine "alte Zuordnung" in den Ausgleichsmetadaten.

Grundsätzlich wird die Methode #subscription() für jeden aktiven Verbraucher aufgerufen. Er sendet die Subskriptionsinformationen des Konsumenten (dh zu welchen Themen ein Verbraucher abonnieren möchte) sowie optionale Metadaten an die Broker.

In einem zweiten Schritt berechnet der Leiter der Verbrauchergruppe die tatsächliche Zuordnung innerhalb von #assign(). Der verantwortliche Broker sammelt alle in der ersten Phase des Rebalancings von #subscription() angegebenen Informationen und übergibt sie an #assign(). Auf diese Weise erhält der Leiter einen globalen Überblick über die gesamte Gruppe und kann somit sicherstellen, dass die Partitionen in einer gemeinsam angeordneten Weise zugewiesen werden.

Im letzten Schritt erhielt der Broker die berechnete Zuweisung vom Leader und sendete sie an alle Konsumenten der Gruppe. Dies führt zu einem Anruf bei an jedem Verbraucher.

helfen Dies könnte auch:

+0

Danke für die ausführliche Antwort. Ich werde versuchen, das Kafka-Streams-Verhalten nachzuahmen. Falls das nicht funktioniert, wissen Sie, ob etwas, das Python wie Apache Spark unterstützt, das gleiche Themen-Verbindungsverhalten wie Kafka Streams bietet? – thehouse

+0

Ich bin nicht vertraut mit den Details von Spark - aber es ist Micro-Batch-Ansatz scheint es schwierig zu machen, richtige Stream-Verarbeitung für mich zu tun. –

Verwandte Themen