2015-09-24 15 views
7

Ich verwende kafka, um die Ereignisse von Seitenbesuchen der Website-Benutzer zu einem Analysedienst zu streamen. Jedes Ereignis wird folgende Angaben für den Verbraucher enthalten:Ist es möglich, ein Kafka-Thema mit dynamischer Partitionsanzahl zu erstellen?

  • Benutzer-ID
  • IP-Adresse des Benutzers

ich einen sehr hohen Durchsatz benötigen, so entschied ich mich, das Thema mit Partition Schlüssel zu partitionieren als userId-ipAddress dh

Für eine userId 1000 und IP-Adresse 10.0.0.1, wird das Ereignis Partitionsschlüssel als "1000-10.0.0.1" haben

In diesem Anwendungsfall ist der Partitionsschlüssel dynamisch, daher muss die Anzahl der Partitionen im Vorfeld beim Erstellen des Themas angegeben werden. Ist es möglich, ein Thema in Kafka mit dynamischer Partitionsanzahl zu erstellen?

Ist es eine gute Praxis, diese Art von Partitionierung zu verwenden oder gibt es eine andere Möglichkeit, dies zu erreichen?

Antwort

10

Es ist nicht möglich, ein Kafka-Thema mit dynamischer Partitionsanzahl zu erstellen. Wenn Sie ein Thema erstellen, müssen Sie die Anzahl der Partitionen angeben. Sie können es später manuell ändern, indem Sie Replication Tools verwenden.

Aber ich verstehe nicht, warum Sie in erster Linie dynamische Partitionszählung benötigen. Der Partitionsschlüssel hängt nicht mit der Anzahl der Partitionen zusammen. Sie können Ihren Partitionsschlüssel mit zehn Partitionen oder mit tausend Partitionen verwenden. Wenn Sie eine Nachricht an Kafka senden, muss Kafka diese an eine bestimmte Partition senden. Jede Partition identifiziert sich durch ihre ID, die einfach eine Nummer ist. Kafka berechnet so etwas wie dies

partition_id = hash(partition_key) % number_of_partition 

und es sendet die Nachricht partition_id zu partitionieren. Wenn Sie weit mehr Benutzer als Partitionen haben, sollten Sie in Ordnung sein. Weitere Vorschläge:

  • Verwenden Sie userId als Partitionsschlüssel. Sie benötigen wahrscheinlich keine IP-Adresse als Teil des Partitionsschlüssels. Wozu ist es gut? In der Regel benötigen Sie alle Nachrichten eines einzelnen Benutzers, um auf einer einzelnen Partition zu landen. Wenn Sie eine IP-Adresse als Partitionsschlüssel haben, könnten die Nachrichten von einem einzelnen Benutzer in mehreren Partitionen landen. Ich kenne deinen Anwendungsfall nicht, aber es ist allgemein nicht das, was du willst.
  • Messen Sie, wie viele Partitionen Sie benötigen, um alle Nachrichten zu verarbeiten. Dann erstellen wir zehn mal mehr Partitionen. Sie können mehr Partitionen erstellen, als Sie tatsächlich benötigen. Kafka hat nichts dagegen und es gibt keine Leistungsstrafen. Siehe How to choose the number of topics/partitions in a Kafka cluster?

Jetzt sollten Sie in der Lage sein, alle Nachrichten in Ihrem System zu verarbeiten. Wenn der Verkehr zunimmt, können Sie weitere Kafka-Broker hinzufügen, und Sie können Replikationstools verwenden, um Vorreiter/Replikate für Partitionen zu ändern. Wenn der Verkehr mehr als zehn Mal zunimmt, müssen Sie neue Partitionen erstellen.