Confluent Schema del Registro di sistema è in realtà un po 'incoerente con i nomi di soggetti :)
In effetti, il KafkaAvroSerializer
(utilizzato per la nuova Kafka 0.8.2 produttore) utilizza topic-key|value
modello per i soggetti (link), mentre KafkaAvroEncoder
(per il vecchio produttore) utilizza il modello schema.getName()-value
(link).
Il motivo per cui si dovrebbe avere 2 diversi soggetti per ogni argomento (uno per la chiave, uno per il valore) è piuttosto semplice:
dire che ho uno schema Avro che rappresenta una voce di registro, e ogni voce di registro ha una fonte informazioni ad esso collegato:
{
"type":"record",
"name":"LogEntry",
"fields":[
{
"name":"line",
"type":"string"
},
{
"name":"source",
"type":{
"type":"record",
"name":"SourceInfo",
"fields":[
{
"name":"host",
"type":"string"
},
{
"name":"...",
"type":"string"
}
]
}
}
]
}
Un caso d'uso comune sarebbe che voglio dividere le entrate per fonte, quindi vorrebbe avere due soggetti associati per argomento (e soggetti sono fondamentalmente le revisioni degli schemi Avro) - uno per chiave (che è SourceInfo
) e una per il valore (LogEntry
).
Avere questi due soggetti sarebbe il partizionamento e la memorizzazione dei dati finché ho un registro dello schema in esecuzione e i miei produttori/consumatori possono parlare con esso. Qualsiasi modifica a questi schemi si rifletterà nel registro dello schema e fintanto che soddisferanno le impostazioni di compatibilità tutto dovrebbe essere serializzato/deserializzato senza che ci si debba preoccupare di questo.
Nota: qualsiasi ulteriore informazione è solo il mio pensiero personale e forse sono io che ancora non comprendere appieno come questo dovrebbe funzionare in modo potrei sbagliarmi.
In realtà mi piace più come lo KafkaAvroEncoder
è implementato piuttosto che lo KafkaAvroSerializer
. KafkaAvroEncoder
non impone in alcun modo l'utilizzo di UNO schema per argomento chiave \ valore mentre lo fa KafkaAvroSerializer
. Questo potrebbe essere un problema quando si pianifica di produrre dati per più schemi Avro in un argomento. In questo caso, KafkaAvroSerializer
tenterebbe di aggiornare i soggetti topic-key
e topic-value
e il 99% si interromperà se la compatibilità viene violata (e se si dispone di più schemi Avro sono quasi sempre diversi e incompatibili tra loro).
Dall'altra parte, KafkaAvroEncoder
si preoccupa solo di nomi di schemi e si può tranquillamente produrre dati per più schemi Avro in un unico argomento e tutto dovrebbe funzionare bene (si avranno tanti soggetti come schemi).
Questa incongruenza non è ancora chiara per me e spero che i confluenti possano spiegarlo se vedono questa domanda/risposta.
auguriamo che
aiuta L'idea è che si dovrebbe sempre voler usare il 'KafkaAvroSerializer' per garantire il serializzatore, convalida e registra gli schemi e si seguono le capacità di evoluzione dello schema. In altre parole, non dovresti mai "progettare di produrre dati per più schemi Avro in un argomento" - e se lo fai - lo fai a tuo rischio - senza usare il registro dello schema –
Quindi, Antonios. Come si propone di avere l'evoluzione dello schema, più tipi di eventi, E ordinare tutto mantenuto? –