当前位置: 首页 > news >正文

bex5可以做网站吗/企业宣传方式

bex5可以做网站吗,企业宣传方式,如何用front做网站网页,wordpress 插件 您没有足够的权限访问该页面同一类框架,后出现的总会吸收之前框架的优点,然后加以改进,avro在序列化方面相对thrift就是一个很好的例子。借用Apache Avro 与 Thrift 比较 一文中的几张图来说明一下,avro在序列化方面的改进: 1、无需强制生成目标语…

同一类框架,后出现的总会吸收之前框架的优点,然后加以改进,avro在序列化方面相对thrift就是一个很好的例子。借用Apache Avro 与 Thrift 比较 一文中的几张图来说明一下,avro在序列化方面的改进:

1、无需强制生成目标语言代码

avro提供了二种使用方式,一种称之为Sepcific方式,这跟thrift基本一致,都是写定义IDL文件,然后用编译器(或插件)生成目标class,另一种方式是Generic,这种方式下,不用生成目标代码,而是采用动态加载定义文件的方式,将 FieldName - FieldValue,以Map<K,V>的方式存储。

 

2、scheme/tag信息不重复写入二进制数据,存储及传输更高效

上图是thrift的存储格式,每块数据前都有一个tag用于标识数据域的类型及编号(这部分tag信息可以理解为数据域的meta信息),如果传输一个List集合,集合中的每条记录,这部分meta信息实际是重复存储的,多少有些浪费。

这是avro的改进,avro抛弃了对Filed编号的做法,而是直接在class的头部,把所有schema元数据信息包含在内(见下面的java代码),这样,client与server二端其实都已经知道数据的schema(架构模式)信息,仅仅在client与server通讯初始化,首次传输即可,以后无需再传递这部分信息,提升了网络传输效率。类似刚才的List集合这种情况,这部分信息也需要重复存储到2进制数据中,反序列化时,也不需再关注schema的信息,存储空间更小。

package yjmyzz.avro.study.dto;@SuppressWarnings("all")
@org.apache.avro.specific.AvroGenerated
public class QueryParameter extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"QueryParameter\",\"namespace\":\"yjmyzz.avro.study.dto\",\"fields\":[{\"name\":\"ageStart\",\"type\":\"int\"},{\"name\":\"ageEnd\",\"type\":\"int\"}]}");public static org.apache.avro.Schema getClassSchema() {return SCHEMA$;}//...
}

这是avro生成的java代码,从源代码可以印证Schema确实已经包含在java代码内。

关于avro的序列化,可以用下面的代码测试一下:

package yjmyzz.avro.test;import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.*;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import org.junit.Assert;
import org.junit.Test;
import yjmyzz.avro.study.dto.QueryParameter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;public class SerializeTest {@Testpublic void test() throws IOException {QueryParameter queryParameter = getQueryParameter();//****** 1 Specific 方式-序列化*******//ByteArrayOutputStream out1 = new ByteArrayOutputStream();DatumWriter<QueryParameter> writer1 = new SpecificDatumWriter<QueryParameter>(QueryParameter.class);BinaryEncoder encoder1 = EncoderFactory.get().binaryEncoder(out1, null);writer1.write(queryParameter, encoder1);encoder1.flush();out1.close();byte[] byte1 = out1.toByteArray();System.out.println("Avro Specific二进制序列后的byte数组长度:" + byte1.length);//反序列化DatumReader<QueryParameter> reader1 = new SpecificDatumReader<QueryParameter>(QueryParameter.class);Decoder decoder1 = DecoderFactory.get().binaryDecoder(out1.toByteArray(), null);QueryParameter result1 = reader1.read(null, decoder1);Assert.assertEquals(queryParameter.getAgeStart(), result1.getAgeStart());Assert.assertEquals(queryParameter.getAgeEnd(), result1.getAgeEnd());//**我是万恶的分割线***////****** 2 Genericy 方式-序列化*******//Schema.Parser parser = new Schema.Parser();//Schema schema = parser.parse(new File("/Users/jimmy/Work/Code/avro/avro-contract/src/main/avro/QueryParameter.avsc"));Schema schema = parser.parse(getClass().getResourceAsStream("/QueryParameter.avsc"));//根据schema创建一个record示例(跟反射的思想有点类似)GenericRecord datum = new GenericData.Record(schema);datum.put("ageStart", 1);datum.put("ageEnd", 5);//序列化ByteArrayOutputStream out2 = new ByteArrayOutputStream();DatumWriter<GenericRecord> writer2 = new GenericDatumWriter<GenericRecord>(schema);Encoder encoder2 = EncoderFactory.get().binaryEncoder(out2, null);writer2.write(datum, encoder2);encoder2.flush();out2.close();byte[] byte2 = out2.toByteArray();System.out.println("Avro Generic二进制序列后的byte数组长度:" + byte2.length);//反序列化DatumReader<GenericRecord> reader2 = new GenericDatumReader<GenericRecord>(schema);Decoder decoder2 = DecoderFactory.get().binaryDecoder(out2.toByteArray(), null);GenericRecord result2 = reader2.read(null, decoder2);Assert.assertEquals(datum.get("ageStart"), result2.get("ageStart"));Assert.assertEquals(datum.get("ageEnd"), result2.get("ageEnd"));}private QueryParameter getQueryParameter() {QueryParameter query = new QueryParameter();query.setAgeStart(1);query.setAgeEnd(5);return query;}
}

Avro Specific二进制序列后的byte数组长度:2
Avro Generic二进制序列后的byte数组长度:2

与前一篇thrift中的序列化结果相比,存储占用的空间比thrift的TCompactProtocol还要小,确实在序列化方面avro做得更好。

但是,凡事总有二面性,虽然avro在序列化方面做了不少改进,但是其RPC的实现并没有做出太多的创新,默认提供的HttpServer、NettyServer都是直接用的其它开源产品实现,不象Thrift自己提供了全新的实现,所以在RPC的性能方面,avro仍有很多可以优化的空间,默认情况下,从我自己测试的情况下,avro是不敌thrift的。但具体能优化到什么程度,就看使用的人在网络通讯、网络协议方面的功底了,有朋友说avro使用c#语言开发Server与Client端,对源代码优化后,可达到每秒20~30万的处理数。

http://www.lbrq.cn/news/1534663.html

相关文章:

  • 网络营销推广方式有几种/网站应该如何进行优化
  • 重庆网站商城/企业网络组建方案
  • 企业门户网站怎么做/英语培训机构
  • 高端网站建设多少钱/找代写文章写手
  • 个人网站模板之家/推广普通话手抄报内容大全
  • 建筑涂料网站设计/哪里做网站便宜
  • 台州招聘网站建设/近期国际新闻热点大事件
  • 房产中介网站建设的目的/seo的理解
  • 祥云网站建设/写软文一篇多少钱合适
  • 织金网站建设/海外推广解决方案
  • 做网站用什么后缀好/关键词调词平台费用
  • 网站宣传专利被罚/乔拓云建站平台
  • 省建设厅网站物业管理/查询网站服务器
  • 网站的方案/肇庆百度快照优化
  • 工业电商做网站怎么样/海门网站建设
  • 网站流量统计表格/搜索引擎技术优化
  • html5 微信网站 源码/阿里云域名注册官网网址
  • 在招聘网站做销售/百度游戏
  • 网页设计师职位要求/seo教程seo官网优化详细方法
  • axure做高保真网站效果图/网站设计公司苏州
  • 网站用oracle做数据库/哪家公司建设网站好
  • 南京华璋建设网站/提高关键词排名的软文案例
  • 兰州企业 网站建设/软文营销成功案例
  • wordpress插件汉化/网页优化
  • 企业服务代理公司/百度seo优化分析
  • wordpress公式编辑器/佛山市seo推广联系方式
  • 建设行政管理部门网站/爱战网关键词工具
  • 太原营销型网站建设/洛阳网站seo
  • 中小网站建设都有哪些/百度注册新账号
  • 苏州工业园区图片/seo实战培训班
  • 从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南
  • 微服务的编程测评系统13-我的竞赛列表-elasticSearch
  • 2025.7.19卡码刷题-回溯算法-组合
  • Flask高效数据库操作指南
  • FPGA实现Aurora 64B66B图像视频点对点传输,基于GTH高速收发器,提供2套工程源码和技术支持
  • Ubuntu-安装Epics Archiver Appliance教程