我正在尝试查找有关使用两种不同的Avro类型发送Kafka消息的性能和(不利)优势的信息。根据我的研究,可以创建基于avro的Kafka消息的有效载荷,如下所示:
EITHER:
GenericRecord的实例可以通过调用new GenericData.Record并将从模式注册表读取的模式作为参数传递来创建:
大致:
private CachedSchemaRegistryClient schemaRegistryClient;
private Schema valueSchema;
// Read a schema
//…
this.valueSchema = schemaRegistryClient.getBySubjectAndID("TestTopic-value",1);
// Define a generic record according to the loaded schema
GenericData.Record record = new GenericData.Record(valueSchema);
// Send to kafka
ListenableFuture<SendResult<String, GenericRecord>> res;
res = avroKafkaTemplate
.send(MessageBuilder
.withPayload(record)
.setHeader(KafkaHeaders.TOPIC, TOPIC)
.setHeader(KafkaHeaders.MESSAGE_KEY, record.get("id"))
.build());
OR:
扩展SpecificRecordBase并在Maven的帮助下生成的类(从包含Avro架构的文件中生成)
/..
public class MyClass extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord
/..
MyClass myAvroClass = new MyClass();
ListenableFuture<SendResult<String, MyClass>> res;
res = avroKafkaTemplate
.send(MessageBuilder
.withPayload(myAvroClass)
.setHeader(KafkaHeaders.TOPIC, TOPIC)
.setHeader(KafkaHeaders.MESSAGE_KEY, myAvroClass.getId())
.build());
调试包含扩展了[[GenericRecord类的实例的一段代码时,可以看到其中包含一个模式。
关于该帐户,我有几个问题:GenericRecord
SpecificRecord
SpecificRecord
性能方面,虽然我尚未对其进行基准测试,但我估计两者的序列化时间大致相同,而对于Generic而言,反序列化会更快,因为字段访问和类型转换将推迟到您自己的代码中,而不是针对每个字段