java—使用不同avro类型向kafka发送消息的性能—specificrecordbase与使用schema registry的genericrecord

tquggr8v  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(764)

我试图找到一些关于使用两种不同的avro类型发送kafka消息的性能和(dis)优势的信息。根据我的研究,可以创建一个基于avro的kafka消息的有效负载:
或者:
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());

或:
扩展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的类示例的代码时,可以看到其中包含一个模式。
因此,我有几个问题:
如果我向kafka发送一个genericord示例,是否也发送了底层模式?
如果没有,它什么时候掉下来的?哪个类/方法负责从genericrecord中提取字节并删除基础架构,以便它不会与有效负载一起发送?如果是的话,那么模式注册表有什么意义呢?
如果一个类扩展了specificrecord,那么底层模式也会被发送,不是吗?这意味着,如果我使用一个函数来接收一个kafka消息并计算它的字节数,那么在一个特定的记录消息中应该比在一个普通的记录消息中需要更多的字节,对吗?
一个specificrecord示例给了我更多的控制,而且使用起来不太容易出错。如果一个模式不是用genericrecord发送的,而是用specificrerd发送的,那么我们就有一个折衷方案。一方面(specificrecord),因为有了清晰的api,所以使用起来很简单(不必背诵所有字段,也不必写get(“x”)、get(“y”)等),另一方面,由于必须发送模式,所以有效负载的大小会增加。如果我有一个比较大的模式(50个字段),我应该选择在模式注册表的帮助下发送genericords,否则性能会受到负面影响,因为模式必须随每条消息一起发送,对吗?

pepwfjgg

pepwfjgg1#

在泛型和特定的两种情况下,模式都由生产者发送和缓存
性能方面,虽然我还没有对其进行基准测试,但我估计这两种方法的序列化时间大致相同,而泛型方法的反序列化速度更快,因为字段访问和类型转换将推迟到您自己的代码中,而不是针对每个字段进行验证
注意:还有reflectdata记录,由于使用反射,记录速度可能较慢

相关问题