Java 使用不同Avro类型向卡夫卡发送消息的性能–;SpecificRecordBase与带有模式注册表的GenericRecord
我试图找到一些关于使用两种不同Avro类型发送卡夫卡消息的性能和(dis)优势的信息。 根据我的研究,可以创建基于avro的卡夫卡消息的有效负载,如下所示: 任一: GenericRecord的实例可以通过调用新的GenericData.Record并将从架构注册表读取的架构作为参数传递来创建: 大致:Java 使用不同Avro类型向卡夫卡发送消息的性能–;SpecificRecordBase与带有模式注册表的GenericRecord,java,apache-kafka,avro,confluent-platform,confluent-schema-registry,Java,Apache Kafka,Avro,Confluent Platform,Confluent Schema Registry,我试图找到一些关于使用两种不同Avro类型发送卡夫卡消息的性能和(dis)优势的信息。 根据我的研究,可以创建基于avro的卡夫卡消息的有效负载,如下所示: 任一: GenericRecord的实例可以通过调用新的GenericData.Record并将从架构注册表读取的架构作为参数传递来创建: 大致: private CachedSchemaRegistryClient schemaRegistryClient; private Schema valueSchema; // Read a sc
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());
private CachedSchemaRegistryClient schemaRegistryClient;
私有模式值模式;
//读取模式
//…
this.valueSchema=schemaRegistryClient.getBySubjectAndID(“TestTopic值”,1);
//根据加载的架构定义通用记录
GenericData.Record记录=新的GenericData.Record(valueSchema);
//送去卡夫卡
可上市未来研究;
res=avroKafkaTemplate
.send(MessageBuilder)
.有效载荷(记录)
.setHeader(KafkaHeaders.TOPIC,TOPIC)
.setHeader(KafkaHeaders.MESSAGE_键,record.get(“id”))
.build());
或:
扩展SpecificRecordBase并在Maven帮助下生成的类(从包含Avro模式的文件中生成)
/。。
公共类MyClass扩展org.apache.avro.specific.SpecificRecordBase实现org.apache.avro.specific.SpecificRecord
/..
MyClass myAvroClass=新的MyClass();
可上市未来研究;
res=avroKafkaTemplate
.send(MessageBuilder)
.带有效载荷(myAvroClass)
.setHeader(KafkaHeaders.TOPIC,TOPIC)
.setHeader(KafkaHeaders.MESSAGE_键,myAvroClass.getId())
.build());
当调试一段包含扩展GenericRecord的类实例的代码时,可以看到其中包含一个模式
因此,我有几个问题:
如果没有,它什么时候掉下来?哪个类/方法负责从GenericRecord中提取字节,并删除底层架构,使其不会与有效负载一起发送? 如果是,那么模式注册表有什么意义
无论是泛型模式还是特定模式,模式都由生产者发送和缓存 就性能而言,虽然我还没有对其进行基准测试,但我估计这两种方法的序列化时间大致相同,而泛型方法的反序列化速度更快,因为字段访问和类型转换将延迟到您自己的代码中,而不是针对每个字段进行验证
注意:还有ReflectData记录,由于使用reflection,速度可能会变慢我感到困惑,因为您在这里写道:使用SR是有益的,因为“您在主题上节省了一些空间,并且没有将模式作为消息的一部分发送”。你在这里写道,它是以任何方式发送的,它是与卡夫卡的实际记录分开发送的。
/..
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());