Oltre alla risposta accettata molto utile, vorrei aggiungere alcuni dettagli in più
Partizionamento
Per impostazione predefinita, Kafka utilizza la chiave del messaggio per selezionare la partizione dell'argomento in cui scrive. Questo viene fatto da qualcosa di simile
hash(key) % number_of_partitions
Se non viene fornita alcuna chiave, Kafka partizionerà i dati in modo casuale in modo round robin.
Ordinazione
Come indicato nella risposta data, Kafka ha garanzie sull'ordinamento dei messaggi solo a livello di partizione.
Supponiamo che tu voglia archiviare le transazioni finanziarie per i tuoi clienti in un argomento Kafka con due partizioni. I messaggi potrebbero apparire come (chiave: valore)
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}
Poiché non abbiamo definito una chiave, le due partizioni presumibilmente saranno simili
// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}
Il tuo consumatore leggendo quell'argomento potrebbe finire per dirti che il saldo del conto è di 600 in un determinato momento, anche se non è mai stato così! Solo perché stava leggendo tutti i messaggi nella partizione 0 prima dei messaggi nella partizione 1.
Con una chiave sensata (come customerId) questo potrebbe essere evitato in quanto il partizionamento sarebbe come questo:
// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}
Compattazione del registro
Senza una chiave come parte dei tuoi messaggi, non sarai in grado di impostare la configurazione dell'argomento cleanup.policy
su compacted
. Secondo la documentazione, "la compattazione del registro garantisce che Kafka conserverà sempre almeno l'ultimo valore noto per ciascuna chiave di messaggio all'interno del registro dei dati per una singola partizione di argomento".
Questa impostazione piacevole e utile non sarà disponibile senza alcuna chiave.
Utilizzo delle chiavi
Nei casi d'uso della vita reale, la chiave di un messaggio Kafka può avere un'enorme influenza sulle tue prestazioni e sulla chiarezza della tua logica aziendale.
Ad esempio, una chiave può essere utilizzata naturalmente per partizionare i dati. Dato che puoi controllare i tuoi consumatori in modo che leggano da partizioni particolari, questo potrebbe servire come un filtro efficiente. Inoltre, la chiave può includere alcuni metadati sul valore effettivo del messaggio che consentono di controllare la successiva elaborazione. Le chiavi sono generalmente più piccole dei valori ed è quindi più conveniente analizzare una chiave anziché l'intero valore. Allo stesso tempo, puoi applicare tutte le serializzazioni e la registrazione dello schema come fatto con il tuo valore anche con la chiave.
Come nota, c'è anche il concetto di intestazione che può essere utilizzato per memorizzare le informazioni, vedere la documentazione .