我正在尝试查找有关使用两种不同的Avro类型发送Kafka消息的性能和(不利)优势的信息。
根据我的研究,可以创建基于avro的Kafka消息的有效载荷,如下所示:

等等:

可以通过调用新的GenericData.Record并传递从Schema Registry中读取的模式作为参数来创建其实例的GenericRecord:

大致:

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());


要么:

扩展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实例发送到Kafka,是否也发送了基础架构?
如果没有,什么时候掉线?哪个类/方法负责从GenericRecord中提取字节并删除基础架构,以使其不与有效负载一起发送?
如果是,那么架构注册表的意义何在?
如果是扩展SpecificRecord的类,则还会发送基础模式,不是吗?这意味着,如果我使用了一个接收Kafka消息并计算其字节数的函数,那么我期望在特定记录消息中比在通用记录消息中有更多的字节,对吗?
SpecificRecord实例为我提供了更多控制权,并且使用情况不易出错。如果不是通过GenericRecord发送模式,而是通过SpecificRecord发送模式,那么我们就要进行权衡。
一方面(SpecificRecord),使用了简单的方法,因为可以使用清晰的API(不必一定要完全知道所有字段,并编写get(“ X”),get(“ Y”)等)。 ,另一方面,由于必须随同模式一起发送,因此有效负载的大小会增加。如果我有一个相对较大的架构(50个字段),则应该选择在架构注册表的帮助下发送GenericRecords,否则性能会受到负面影响,因为必须随每条消息一起发送架构,对吗?

最佳答案

在通用或特定情况下,模式都由生产者发送和缓存

在性能方面,虽然我尚未对其进行基准测试,但我估计两者的序列化时间大致相同,而对于通用而言,反序列化会更快,因为字段访问和类型转换将推迟到您自己的代码中,而不是针对每个字段进行验证

注意:还有ReflectData记录,由于使用了反射,记录可能会变慢

08-06 02:06