Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用不同Avro类型向卡夫卡发送消息的性能–;SpecificRecordBase与带有模式注册表的GenericRecord_Java_Apache Kafka_Avro_Confluent Platform_Confluent Schema Registry - Fatal编程技术网

Java 使用不同Avro类型向卡夫卡发送消息的性能–;SpecificRecordBase与带有模式注册表的GenericRecord

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

我试图找到一些关于使用两种不同Avro类型发送卡夫卡消息的性能和(dis)优势的信息。 根据我的研究,可以创建基于avro的卡夫卡消息的有效负载,如下所示:

任一

GenericRecord的实例可以通过调用新的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());
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的类实例的代码时,可以看到其中包含一个模式

因此,我有几个问题:

  • 如果我向Kafka发送GenericRecord实例,是否也会发送基础架构?
    如果没有,它什么时候掉下来?哪个类/方法负责从GenericRecord中提取字节,并删除底层架构,使其不会与有效负载一起发送? 如果是,那么模式注册表有什么意义

  • 对于扩展SpecificRecord的类,也会发送底层模式,不是吗?这意味着,如果我使用一个函数来接收卡夫卡消息并计算它的字节数,那么在一个特定的记录消息中,我应该期望比在一个通用记录消息中更多的字节,对吗

  • SpecificRecord实例为我提供了更多的控制,并且其使用不太容易出错。如果一个模式不是用GenericRecord发送的,而是用SpecificRecord发送的,那么我们有一个折衷方案。 一方面(SpecificRecord),由于清晰的API可用,因此使用非常简单(不必背诵所有字段,也不必写get(“X”)、get(“Y”)等),另一方面,由于必须随模式一起发送,有效负载的大小会增加。如果我有一个相对较大的模式(50个字段),我应该选择在模式注册表的帮助下发送GenericRecords,否则性能将受到负面影响,因为模式必须随每条消息一起发送,对吗


  • 无论是泛型模式还是特定模式,模式都由生产者发送和缓存

    就性能而言,虽然我还没有对其进行基准测试,但我估计这两种方法的序列化时间大致相同,而泛型方法的反序列化速度更快,因为字段访问和类型转换将延迟到您自己的代码中,而不是针对每个字段进行验证


    注意:还有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());