2015-09-24 15 views
7

Sto utilizzando kafka per trasmettere in streaming gli eventi delle visite alle pagine degli utenti del sito Web a un servizio di analisi. Ogni evento conterrà i seguenti dettagli per il consumatore:È possibile creare un argomento kafka con il conteggio delle partizioni dinamico?

  • user id
  • indirizzo
  • IP dell'utente

ho bisogno molto elevato throughput, così ho deciso di dividere l'argomento con chiave di partizione come userId-ipAddress cioè

Per un userId 1000 e l'indirizzo IP 10.0.0.1, l'evento avrà chiave di partizione come "1000-10.0.0.1"

In questo caso di utilizzo, la chiave di partizione è dinamica, pertanto è necessario specificare il numero di partizioni in anticipo durante la creazione dell'argomento. È possibile creare un argomento in kafka con il conteggio delle partizioni dinamico?

È una buona pratica utilizzare questo tipo di partizionamento o esiste un altro modo per ottenerlo?

risposta

10

Non è possibile creare un argomento di Kafka con il conteggio delle partizioni dinamico. Quando crei un argomento devi specificare il numero di partizioni. È possibile modificarlo in seguito manualmente utilizzando Replication Tools.

Ma non capisco perché è necessario il conteggio dinamico delle partizioni in primo luogo. La chiave di partizione non è correlata al numero di partizioni. È possibile utilizzare la chiave di partizione con dieci partizioni o con migliaia di partizioni. Quando si invia un messaggio all'argomento di Kafka, Kafka deve inviarlo a una partizione specifica. Ogni partizione è identificata dal suo ID che è semplicemente un numero. Kafka calcola qualcosa di simile

partition_id = hash(partition_key) % number_of_partition 

ed invia il messaggio per partizionare partition_id. Se hai molti più utenti delle partizioni, dovresti essere OK. Altri suggerimenti:

  • Utilizzare userId come chiave di partizione. Probabilmente non hai bisogno dell'indirizzo IP come parte della chiave di partizione. Per cosa è buono? In genere è necessario che tutti i messaggi di un singolo utente finiscano in un'unica partizione. Se si dispone di un indirizzo IP come chiave di partizione, i messaggi di un singolo utente potrebbero finire in più partizioni. Non conosco il tuo caso d'uso ma è generale che non è quello che vuoi.
  • Misurare il numero di partizioni necessarie per elaborare tutti i messaggi. Quindi crea diciamo dieci volte più partizioni. È possibile creare più partizioni di quelle effettivamente necessarie. A Kafka non dispiacerà e non ci saranno penalità per le prestazioni. Vedi How to choose the number of topics/partitions in a Kafka cluster?

In questo momento dovresti essere in grado di elaborare tutti i messaggi nel tuo sistema. Se il traffico aumenta, puoi aggiungere altri broker Kafka e puoi utilizzare gli strumenti di replica per cambiare leader/repliche per le partizioni. Se il traffico aumenta più di dieci volte, è necessario creare nuove partizioni.

Problemi correlati