2015-04-08 7 views
21

KeyedMessage<String, byte[]> keyedMessage = new KeyedMessage<String, byte[]>(request.getRequestTopicName(),SerializationUtils.serialize(message)); producer.send(keyedMessage);Sia chiave è richiesto come parte del messaggio che trasmette in Kafka

Attualmente, vi mando un messaggio, senza alcun tasto mantenuto come parte del messaggio digitato, sarà ancora lavorare con delete.retention.ms, Ho bisogno di inviare la chiave come parte del messaggio? È buono per rendere la chiave come parte del messaggio

risposta

49

Le chiavi sono per lo più utili/necessarie se si richiede un ordine forte per una chiave e si sta sviluppando qualcosa come una macchina a stati. Se si richiede che i messaggi con la stessa chiave (ad esempio un ID univoco) vengano sempre visualizzati nell'ordine corretto, il collegamento di una chiave ai messaggi garantisce che i messaggi con la stessa chiave vengano sempre indirizzati alla stessa partizione in un argomento. Kafka garantisce l'ordine all'interno di una partizione, ma non attraverso le partizioni in un argomento, quindi in alternativa non fornire una chiave - che comporterà la distribuzione round-robin attraverso le partizioni - non manterrà tale ordine.

Nel caso di una macchina a stati, è possibile utilizzare i tasti con log.cleaner.enable per deduplicare le voci con la stessa chiave. In tal caso, Kafka presume che l'applicazione si preoccupi solo dell'istanza più recente di una determinata chiave e il pulitore del registro cancella i duplicati più vecchi di una determinata chiave solo se la chiave non è nulla. Questa forma di compattazione del registro è controllata dalla proprietà log.cleaner.delete.retention e richiede le chiavi.

In alternativa, la proprietà più comune log.retention.hours, che è abilitata per impostazione predefinita, funziona eliminando segmenti completi del registro non aggiornati. In questo caso non è necessario fornire le chiavi. Kafka eliminerà semplicemente blocchi del registro più vecchi del periodo di conservazione specificato.

Questo è tutto da dire, se hai abilitato log compaction o richiedi un ordine rigoroso per i messaggi con la stessa chiave, allora dovresti sicuramente usare le chiavi. In caso contrario, le chiavi null potrebbero fornire una migliore distribuzione e prevenire potenziali problemi di hot spot nei casi in cui alcune chiavi potrebbero apparire più di altre.

+0

Sono nuovo di Kafka che è la ragione per cui si fanno tante domande: Ci sono un paio di domande su questo: Prima domanda, possiamo consumare il messaggio sulla base della chiave, Attualmente sto consumando un messaggio da MessagAndMetadata mm. o va bene ignorare la chiave al momento del consumo del messaggio. Sto usando il livello consumer Api. – gaurav

+0

@kuujo Sto assumendo che questa deduplicazione sia solo per voci di log, non necessariamente deduplica i messaggi su una coda di argomenti? – user1658296

+0

Bella risposta. Mi sono collegato a questo sto scrivendo per un documento "Best Practice" su cui sto lavorando (lavoro per un'azienda che si integra con Kafka, tra le altre cose). Questo mi ha aiutato a capire il problema, grazie. –