使用不同Avro类型向Kafka发送消息的性能–使用架构注册表的SpecificRecordBase与GenericRecord的关系

问题描述 投票:0回答:1

我正在尝试查找有关使用两种不同的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类的实例的一段代码时,可以看到其中包含一个模式。

关于该帐户,我有几个问题:

  1. 如果我向Kafka发送

    GenericRecord

实例,是否还会发送基础架构?如果没有,什么时候掉线?哪个类/方法负责从GenericRecord中提取字节并删除基础架构,以使其不与有效负载一起发送?如果是,那么架构注册表的意义何在?
  • 如果是扩展

    SpecificRecord

  • 的类,还发送了基础模式,不是吗?这意味着,如果我采用了一个接收Kafka消息并计算其字节数的函数,那么我期望在特定记录消息中比在通用记录消息中有更多的字节,对吗?
  • A

    SpecificRecord

  • 实例为我提供了更多控制权,并且使用起来不易出错。如果模式不是通过GenericRecord发送的,而是通过SpecificRecord发送的,则需要进行权衡。一方面(SpecificRecord),使用了简单的方法,因为可以使用清晰的API(不必一定要完全知道所有字段,并编写get(“ X”),get(“ Y”)等)。 ,另一方面,有效载荷的大小会增加,因为必须随同模式一起发送。如果我有一个相对较大的架构(50个字段),则应该选择在架构注册表的帮助下发送GenericRecords,否则性能会受到负面影响,因为必须随同每条消息一起发送架构,对吗?
    java apache-kafka avro confluent confluent-schema-registry
    1个回答
    0
    投票
    模式在普通或特定情况下都由生产者发送和缓存

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

    © www.soinside.com 2019 - 2024. All rights reserved.