开发者社区> 问答> 正文

kafka在发送消息时 是先序列化再压缩 还是压缩再序列化呢?

本问题来自阿里云开发者社区的【11大垂直技术领域开发者社群】。https://developer.aliyun.com/article/706511 点击链接欢迎加入感兴趣的技术领域群。

展开
收起
新闻小助手 2019-08-16 15:13:42 1789 0
1 条回答
写回答
取消 提交回答
  • 最近项目中要用Avro对发送到Kafka中的数据进行序列化, 用Avro进行序列化可以有两种方式: 一种是在内存中序列化,另一种是数据文件格式。 改怎么选择呢? 如果想把Avro集成到现有系统,用内存序列化比较好。 其他情况,考虑用Avro的数据文件格式。 Avro官网上对数据文件格式的序列化讲的很清楚,这次不在赘述,只是介绍一下在内存中如何序列化。 我们以一个简单的Avro模式为例 { “type":"record", "name":"Pair", "doc":"A pair of strings.", "fields": [ {"name":"left", "type":"string"}, {"name":"right", "type":"string"} ] } 将这一模式存贮在一个路劲下(一般是resources路劲下),并命名为Pair.avsc(avsc是Avro模式文件的常用扩展名). Schema schema= Schema.parse(getClass().getResourceAsStream("Pair.avsc"); //声明要加载的模式 //创建Avro记录的实例,为记录的String字段构建了一个Avro Utf8实例 GenericRecord datum=new GenericData.Record(schema); datum.put("left",new Utf8("L")); datum.put("right",new Utf8("R")); //将记录序列化到输出流中 ByteArrayOutputStream out=new ByteArrayOutputStream(); DatumWriter<GenericRecord> write=new GenericDatumWriter<GenericRecord>(schema);//DatumWriter 将数据对象翻译成Encoder对象可以理解的类型, Encoder encoder= new BinaryEncoder(out);//然后由Encoder写到数据流。 write.write(datum,encoder); encoder.flush(); out.close(); //反序列化 DatumReader<GenericRecord> reder=new GenericDatumReader<GenericRecord>(schema); Decoder decoder=DecoderFactory.defaultFactory().createBinaryDecoder(out.toByteArray(),null); GenericRecord result=reader.read(null,decoder); assertThat(result.get("left").toString(),is("L")); assertThat(result.get("right").toString,is("R"));

    此答案来源于网络,希望对您有所帮助。

    2019-09-18 19:49:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Java Spring Boot开发实战系列课程【第16讲】:Spring Boot 2.0 实战Apache Kafka百万级高并发消息中间件与原理解析 立即下载
MaxCompute技术公开课第四季 之 如何将Kafka数据同步至MaxCompute 立即下载
消息队列kafka介绍 立即下载