Comprensione di argomenti e partizioni di Kafka


185

Sto iniziando a imparare Kafka per scopi di soluzione aziendale.

Durante le mie letture, mi sono venute in mente alcune domande:

  1. Quando un produttore sta producendo un messaggio, specificherà l' argomento a cui desidera inviare il messaggio, giusto? Si preoccupa delle partizioni?
  2. Quando un abbonato è in esecuzione, specifica il suo ID di gruppo in modo che possa far parte di un gruppo di consumatori dello stesso argomento o di diversi argomenti a cui questo gruppo di consumatori è interessato?
  3. Ogni gruppo di consumatori ha una partizione corrispondente sul broker o ogni consumatore ne ha una?

  4. Le partizioni sono create dal broker e quindi non rappresentano un problema per i consumatori?

  5. Poiché si tratta di una coda con un offset per ogni partizione, è responsabilità del consumatore specificare quali messaggi desidera leggere? Deve salvare il suo stato?

  6. Cosa succede quando un messaggio viene eliminato dalla coda? - Ad esempio: la conservazione è stata di 3 ore, quindi il tempo passa, come viene gestito l'offset su entrambi i lati?

Risposte:


162

Questo post ha già delle risposte, ma sto aggiungendo il mio punto di vista con alcune immagini della Guida definitiva di Kafka

Prima di rispondere a ogni domanda, aggiungiamo una panoramica dei componenti del produttore:

panoramica dei componenti del produttore

1. Quando un produttore sta producendo un messaggio: specificherà l'argomento a cui desidera inviare il messaggio, giusto? Si preoccupa delle partizioni?

Il produttore deciderà la partizione di destinazione in cui inserire qualsiasi messaggio, a seconda di:

  • ID partizione, se specificato nel messaggio
  • chiave% num partitions , se non viene menzionato alcun ID di partizione
  • Round robin se nel messaggio non sono disponibili né ID partizionechiave messaggio, il che significa che è disponibile solo il valore

2. Quando un abbonato è in esecuzione: specifica il suo ID di gruppo in modo che possa far parte di un gruppo di consumatori dello stesso argomento o di diversi argomenti a cui questo gruppo di consumatori è interessato?

Devi sempre configurare group.id a meno che tu non stia utilizzando l'API di assegnazione semplice e non sia necessario archiviare gli offset in Kafka. Non farà parte di nessun gruppo. fonte

3. Ogni gruppo di consumatori ha una partizione corrispondente sul broker o ogni consumatore ne ha una?

In un gruppo di consumatori, ogni partizione verrà elaborata da un solo consumatore . Questi sono i possibili scenari

  • Il numero di consumatori è inferiore al numero di partizioni di argomenti, quindi è possibile assegnare più partizioni a uno dei consumatori del gruppo numero di consumatori inferiore alle partizioni tematiche
  • Il numero di consumatori uguale al numero di partizioni degli argomenti, quindi la partizione e la mappatura dei consumatori possono essere come di seguito, numero di consumatori uguale al numero di partizioni di argomenti
  • Il numero di consumatori è superiore al numero di partizioni di argomenti, quindi la partizione e la mappatura dei consumatori possono essere visualizzate di seguito, Non efficace, controlla Consumatore 5 numero di consumatori superiore al numero di partizioni tematiche

4. Come le partizioni create dal broker, quindi non è una preoccupazione per i consumatori?

Il consumatore dovrebbe essere consapevole del numero di partizioni, come discusso nella domanda 3.

5. Poiché si tratta di una coda con un offset per ogni partizione, è responsabilità dell'utente specificare quali messaggi desidera leggere? Deve salvare il suo stato?

Kafka (per essere il coordinatore del gruppo specifico ) si occupa dello stato di offset producendo un messaggio a un argomento __consumer_offsets interno , questo comportamento può essere configurabile anche manualmente impostando enable.auto.commitsu false. In tal caso consumer.commitSync()e consumer.commitAsync()può essere utile per la gestione dell'offset.

Maggiori informazioni sul coordinatore del gruppo :

  1. È uno dei broker eletti nel cluster dal lato server di Kafka.
  2. I consumatori interagiscono con il coordinatore del gruppo per gli offset offset e le richieste di recupero.
  3. Il consumatore invia battiti cardiaci periodici al coordinatore del gruppo.

6. Cosa succede quando un messaggio viene eliminato dalla coda? - Ad esempio: la conservazione è stata di 3 ore, quindi il tempo passa, come viene gestito l'offset su entrambi i lati?

Se un consumatore inizia dopo il periodo di conservazione, i messaggi verranno consumati secondo la auto.offset.resetconfigurazione che potrebbe essere latest/earliest. tecnicamente è latest(inizia a elaborare nuovi messaggi) perché tutti i messaggi sono scaduti da quel momento e la conservazione è una configurazione a livello di argomento.


5
Ciao ! Sono l'autore della risposta accettata, ma penso che anche la tua sia davvero carina, in particolare il punto 3 in cui i diagrammi rendono le cose più chiare del 200%! Pensi che dovremmo unirci?
C4stor,

Volevo dire che io (o te) potevamo incorporare elementi della tua risposta nella mia, per ottenere loro maggiore visibilità e migliorare questa (attualmente) risposta migliore. Ma non lo farei senza il tuo consenso!
C4stor,

Perché non è possibile mappare il multiutente su una partizione? Per garantire che il messaggio venga elaborato una sola volta? Grazie per la tua risposta.
g10guang,

1
@ g10guang: è a causa della difficoltà nella manutenzione dell'offset del commit .
mrsrinivas,

1
Un altro scenario. Puoi avere UNA partizione e MULTIPLI utenti abbonati / assegnati ad essa. Il broker consegnerà i record solo al primo consumatore registrato. Supponiamo che il primo consumatore impieghi più tempo per elaborare l'attività rispetto all'intervallo di polling. Il consumo record non è impegnato nel broker. Il broker capisce che il consumatore è andato in giro. In questo stato, il broker attiva un riequilibrio inviando le nuove partizioni assegnate a tutti i suoi consumatori. Il messaggio viene nuovamente utilizzato da un altro consumatore anche se è ancora in fase di elaborazione da parte di C1. Stai attento.
Ruben Daddario,

127

Prendiamo quelli in ordine :)

1 - Quando un produttore sta producendo un messaggio - Specifica l'argomento a cui desidera inviare il messaggio, giusto? Si preoccupa delle partizioni?

Per impostazione predefinita, al produttore non interessa il partizionamento. Hai la possibilità di utilizzare un partizionatore personalizzato per avere un controllo migliore, ma è totalmente opzionale.


2 - Quando un abbonato è in esecuzione - Specifica il suo ID di gruppo in modo che possa far parte di un gruppo di consumatori dello stesso argomento o di diversi argomenti a cui questo gruppo di consumatori è interessato?

Sì, i consumatori si uniscono (o creano se sono soli) a un gruppo di consumatori per condividere il carico. Nessuno dei due consumatori dello stesso gruppo riceverà mai lo stesso messaggio.


3 - Ogni gruppo di consumatori ha una partizione corrispondente sul broker o ogni consumatore ne ha una?

Né. A tutti i consumatori di un gruppo di consumatori viene assegnato un insieme di partizioni, a due condizioni: non esistono due consumatori dello stesso gruppo con una partizione in comune e al gruppo di consumatori nel suo insieme viene assegnata ogni partizione esistente.


4 - Le partizioni create dal broker non sono quindi motivo di preoccupazione per i consumatori?

Non lo sono, ma da 3 puoi vedere che è totalmente inutile avere più consumatori rispetto alle partizioni esistenti, quindi è il tuo massimo livello di parallelismo da consumare.


5 - Poiché si tratta di una coda con un offset per ogni partizione, è responsabilità dell'utente specificare quali messaggi desidera leggere? Deve salvare il suo stato?

Sì, i consumatori salvano un offset per argomento per partizione. Questo è totalmente gestito da Kafka, non preoccuparti.


6 - Cosa succede quando un messaggio viene eliminato dalla coda? - Ad esempio: la conservazione è stata di 3 ore, quindi il tempo passa, come viene gestito l'offset su entrambi i lati?

Se un consumatore richiede mai un offset non disponibile per una partizione sui broker (ad esempio, a causa della cancellazione), entra in una modalità di errore e alla fine si reimposta per questa partizione sul messaggio più recente o più vecchio disponibile (a seconda del il valore di configurazione auto.offset.reset) e continuare a lavorare.


3
Sry :) È un po 'difficile spiegare l'intero processo kafka in scatole da 500 caratteri, suggerisco di leggere kafka.apache.org/documentation.html#theconsumer (e probabilmente il resto della sezione 4, sugli interni di kafka). Fondamentalmente: i consumatori richiedono di salvare offset, ma quelli vengono salvati altrove.
C4stor,

Ho appena letto questo e ancora questo non spiega dove si svolge: Kafka lo gestisce in modo diverso. Il nostro argomento è diviso in una serie di partizioni totalmente ordinate, ognuna delle quali viene consumata da un consumatore in un dato momento. Ciò significa che la posizione di un consumatore in ciascuna partizione è solo un singolo numero intero, l'offset del messaggio successivo da consumare. Questo rende lo stato di ciò che è stato consumato molto piccolo, solo un numero per ogni partizione. Questo stato può essere periodicamente controllato. Ciò rende l'equivalente dei riconoscimenti di messaggi molto economici.
Pinidbest,

20

Kafka usa Argomento concezione che viene per portare l'ordine nel flusso di messaggi.

Per bilanciare il carico, un argomento può essere diviso in più partizioni e replicato tra broker.

Le partizioni sono ordinate, sequenze immutabili di messaggi che vengono continuamente aggiunte, ad esempio un registro di commit.

I messaggi nella partizione hanno un numero ID sequenziale che identifica in modo univoco ogni messaggio all'interno della partizione.

Le partizioni consentono al registro di un argomento di ridimensionarsi oltre una dimensione che si adatta a un singolo server (un broker) e che funge da unità di parallelismo.

Le partizioni di un argomento sono distribuite sui broker nel cluster Kafka in cui ciascun broker gestisce i dati e le richieste per una condivisione delle partizioni.

Ogni partizione viene replicata su un numero configurabile di broker per assicurare la tolleranza agli errori.

Ben spiegato in questo articolo: http://codeflex.co/what-is-apache-kafka/


La partizione è solo per il bilanciamento del carico degli argomenti?
g10guang,

1
@ g10guang: le partizioni aiutano anche a elaborare i messaggi in parallelo.
mrsrinivas,

Per favore, correggimi se sbaglio, quando un messaggio viene inviato da un produttore e quando viene inserito nell'argomento, viene copiato nelle partizioni secondo le configurazioni e quindi il consumatore lo consuma. Destra?
Atul,

1
@Atul il messaggio verrà aggiunto a 1 delle partizioni per quell'argomento in base alla configurazione corrente del partizionatore (per impostazione predefinita l'hash della chiave del messaggio determina in quale partizione il messaggio va), e sì, un consumatore raccoglierà il messaggio come consuma messaggi da quella partizione
Kevin Hooke il

@Kevin Hooke, grazie per la spiegazione e per chiarire la mia comprensione.
Atul
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.