Avro 与 Protobuf 性能比较

Cap*_*ngs 6 java serialization performance-testing protocol-buffers avro

我编写了一个 JMH 基准测试来比较 java 1.8 中 Avro (1.8.2) 和 Protobuf (3.5.0) 的序列化性能。根据 JMH 的说法,Protobuf 可以在一秒钟内序列化某些数据 470 万次,而 Avro 每秒只能序列化 800k 次。

序列化的测试数据约为 200 字节,我为 Avro 和 Protobuf 生成了架构。

这是我的 Avro 序列化代码,熟悉 Avro 的人可以确保我没有犯一些重大错误吗?

JMH 进行了基准测试,名为 Serialize 的方法。另外,我已将其发布在https://groups.google.com/forum/#!topic/protobuf/skmE78F-XbE

非常感谢

public final class AvroSerialization{

    private BinartEncoder encoder;
    private final SpecificDatumWriter writer;

    public AvroSerialization( ){
         this.writer = new SpecificDatumWriter( AvroGeneratedClass.class );
    }

    //MyDataObject = A pojo that contains the data to be serialized
    public final byte[] serialize( MyDataObject data ){

         ByteArrayOutputStream  out = new ByteArrayOutputStream( 1024 );
         encoder = EncoderFactory.get().binaryEncoder( out, encoder );

         AvroGeneratedClass avroData = createAvro( data );

         writer.write( avroData, encoder );
         encoder.flush();

         return out.toByteArray();

    }

    //AvroGeneratedClass = Class generated by the Avro Schema
    public final static AvroGeneratedClass createAvro( MyDataObject data ){
         AvroGeneratedClass  avroData = AvroGeneratedClass.newBuilder()
         .setXXX( data.getXXX )
         .setXXX( data.getXXX )
         ... 
         return avroData;
    }

}
Run Code Online (Sandbox Code Playgroud)

小智 -2

AVRO 始终使用其架构序列化数据。

在 protobuf 方法中,服务器假设客户端已经知道模式,因此它只是将数据序列化为二进制格式。

对于事务性工作负载,protobuf 通常更好。

AVRO 通常更适合需要序列化大量记录的分析工作负载。在这种情况下,模式序列化通常可以忽略不计,而 AVRO 序列化则稍微紧凑一些。

  • 请注意,Avro 也具有无模式模式,它只会序列化二进制数据,并假设消费者在反序列化时可以访问模式(表示为 JSON)。 (9认同)
  • 这是不正确的。AVRO 也可用于事务数据,而无需将架构嵌入到数据中。一个例子是带有架构注册表的整个 Kafka 生态系统 (2认同)