2016-05-29 38 views
6

Sto cercando qualche chiarimento sull'argomento. Nella documentazione di Kafka ho trovato quanto segue:Temi, partizioni e chiavi

Kafka fornisce solo un ordine totale sui messaggi all'interno di una partizione, non tra diverse partizioni in un argomento. L'ordinamento per partizione combinato con la capacità di partizionare i dati per chiave è sufficiente per la maggior parte delle applicazioni. Tuttavia, se si richiede un ordine totale sui messaggi, ciò può essere ottenuto con un argomento che ha una sola partizione, sebbene ciò significhi solo un processo consumatore per gruppo di consumatori.

Così qui sono le mie domande:

  1. significa se voglio avere più di 1 dei consumatori (dello stesso gruppo), la lettura da un argomento ho bisogno di avere più di 1 divisorio?

  2. Significa che ho bisogno della stessa quantità di partizioni della quantità di consumatori per lo stesso gruppo?

  3. Quanti utenti possono leggere da una partizione?

Avere anche alcune domande relative alla relazione tra chiavi e partizioni in relazione all'API. Ho solo guardato le API di .net (specialmente una da MS) ma sembra l'API Java mimica. Vedo che quando si utilizza un produttore per inviare un messaggio a un argomento, esiste un parametro chiave. Ma quando il consumatore legge da un argomento c'è un numero di partizione.

  1. Come sono numerate le partizioni? A partire da 0 o 1?
  2. Che rapporto esatto tra una chiave e una partizione? Come ho capito alcune funzioni sul tasto determineranno una partizione. è corretto?
  3. Se ho 2 partizioni in un argomento e desidero che alcuni messaggi particolari vadano a una partizione e altri messaggi vadano a un altro, dovrei usare una chiave specifica per una partizione specifica e il resto per un'altra?
  4. Cosa succede se ho 3 partizioni e un tipo di messaggi in una partizione particolare e il resto in altri 2?
  5. In generale, come faccio a inviare messaggi a una particolare partizione per sapere da un consumatore dove leggere? O sto meglio con più argomenti?

Grazie in anticipo.

risposta

1

Igor,

Partizioni aumentare il parallelismo di argomento Kafka. Qualsiasi numero di consumatori/produttori può utilizzare la stessa partizione. È fino al livello dell'applicazione per definire il protocollo. Kafka garantisce la consegna. Per quanto riguarda l'API, potresti voler esaminare i documenti Java in quanto potrebbero essere più completi. Sulla base della mia esperienza:

  1. Partizioni partono da 0
  2. Le chiavi possono essere utilizzati per inviare messaggi alla stessa partizione. Ad esempio hash (chiave)% num_partition. La logica è collegabile al produttore. https://kafka.apache.org/090/javadoc/index.html?org/apache/kafka/clients/producer/Partitioner.html
  3. Sì. ma fai attenzione a non finire con una chiave che risulterà nella partizione "dedicata". Per questo, potresti voler avere un argomento dedicato.Ad esempio, argomento di controllo e argomento dati
  4. Questa sembra essere la stessa domanda di 3.
  5. Credo che i consumatori non dovrebbero fare assunzioni dei dati basati sulla partizione. L'approccio tipico consiste nell'avere un gruppo di consumatori in grado di leggere da più partizioni di un argomento. Se vuoi avere canali dedicati, è meglio (più sicuro/manutenibile) usare argomenti separati.
0

significa se voglio avere più di 1 dei consumatori (dallo stesso gruppo) la lettura da un argomento ho bisogno di avere più di 1 divisorio?

Vediamo le seguenti proprietà di Kafka:

  • ogni partizione viene consumato da esattamente un consumatore nel gruppo
  • un consumatore nel gruppo può consumare più di una partizione
  • il numero di processi di consumo in un gruppo deve essere < numero di partizioni

Con queste proprietà, Kafka è elegantemente in grado di fornire sia ordering guarantees e load balancing su un pool di processi di consumo.

Per rispondere alla domanda, si, nel contesto dello stesso gruppo, se si desidera avere N consumers, è necessario disporre di at least N topics.

Significa che ho bisogno della stessa quantità di partizioni della quantità di utenti per lo stesso gruppo?

Penso che questo sia stato spiegato nella prima risposta.

Quanti utenti possono leggere da una partizione?

Il number of consumers che può leggere da una partizione è sempre uguale al number of consumer groups sottoscrizione di tale argomento.

Relazione tra i tasti e le partizioni in materia di API

In primo luogo, si deve capire che il producer è responsabile della scelta che registrano da assegnare a quale partizione all'interno del tema.

Ora, vediamo come lo fa il produttore. In primo luogo, vediamo la definizione della classe di ProducerRecord.java:

public class ProducerRecord<K, V> { 

    private final String topic; 
    private final Integer partition; 
    private final Headers headers; 
    private final K key; 
    private final V value; 
    private final Long timestamp; 

} 

Qui, il campo che dobbiamo capire dalla classe è partition.

Dalla documentazione,

  • Se una valida partition number è specificato, che partition verrà utilizzato per l'invio del record.
  • Se non è stata specificata alcuna partizione ma è presente una key, verrà scelta una partizione utilizzando uno hash of the key.
  • Se non è presente né keypartition, verrà assegnata una partizione in un round-robin fashion.