首页 > 其他分享 >Thrift 格式解析

Thrift 格式解析

时间:2023-04-03 09:56:14浏览次数:38  
标签:存储 解析 字节 编号 格式 序列化 string Thrift

Thrift 格式解析

https://www.cnblogs.com/Forever-Kenlen-Ja/p/9649724.html

常用数据格式包括 CSV JSON XML,这些格式有缺点:

  1. CSV没有指定数据类型,如可能将数字开头的字符串无认为数字
  2. 使用文本存储会浪费空间
  3. JSON XML 注重可读,提高程序员效率,但数据存储传输效率不高,尤其大数据低时延场景

使用二进制序列化可有效解决此问题,但是:

  1. 数据格式隐含在代码中,对于每个格式都要手动写序列化反序列化代码
  2. 数据格式变化时,版本不兼容

TBinaryProtocol

  • 通过一个Schema文件定义一个结构体,定义字段顺序、类型、名称
  • 使用已有的程序解析Schema文件,自动生成序列化代码
struct SearchClick
{
    1:string user_id,
    2:string search_term,
    3:i16    rank,
    4:string landing_url,
    // 5:i32    click_timestamp, 已废弃
    6:i64    click_long_timestamp,
    7:string ip_address
}

不仅写入数据的值,还写入编号和类型,每条纪律结束时都写下一个标志位。旧版本程序看到没见过的编号就跳过,新版本程序对于旧版本数据中没有的字段只会读不到不会不兼容。这个机制下编号就起到版本作用,无需版本管理。编号保证无需每个字段都填上,废弃的字段直接注释即可。整个struct变成一个稀疏结构,无需每个字段都填值

TCompactProtocol

论文发布后,又做出了优化。编号和类型实现了向前向后兼容,但是数据冗余变大了。如一个数字,从string转为i32,节约了部分字节,但是加的编号又会占用。使用 Delta Encoding 解决问题,这个协议存储的不是编号的值,而是与上一个编号的差。如第一个是1,第二个是5,那么第二个编号的存储直接对应4。使用4bit存储差值,再用4bit存储类型。通常类型不到16种,字段间的差也不到15。

如果序号间的差超过15怎么办?要使用1字节表示类型,再用 ZigZag+VQL 编码表示序号差。

ZigZag 编码 + VQL 可变长数值表示

TCompactProtocol 对所有整型使用可边长数值(VQL,Variable-length quantity)表示。每个字节高位使用1bit标记整个整数是否需要读取下一字节,后面7bit存放实际数据。一个32位整数最少要1字节,最多5字节。

整型负数首位一定是1,如-1表示位 0XFFFFFFFF。所以没有采用普通16进制编码,而是使用 ZigZag 编码方式:负数变为正数,而正数乘以2,这样7个bit可表示-64到63这128个数。只要整型数绝对值小,占用的空间就小。

使用 ZigZag+VQL 后存储一个整型通常只要2个字节

Thrift实现了 跨语言+序列化+RPC

Thrift是protobuf和gPRC的结合,而Apache Avro对比这二者无需预先进行代码生成,也无需指定数据编号

标签:存储,解析,字节,编号,格式,序列化,string,Thrift
From: https://www.cnblogs.com/zhh567/p/17282167.html

相关文章

  • JSON的创建格式和常用方法
       ......
  • 时间日期解析配置
    @ConfigurationpublicclassLocalDateTimeConfig{/**序列化内容*LocalDateTime->String*服务端返回给客户端内容**/@BeanpublicLocalDateTimeSerializerlocalDateTimeSerializer(){returnnewLocalDateTimeSeria......
  • Antd DatePicker 表单Value 转为 日期字符串格式
    AntdDatePicker表单Value转为日期字符串格式遇到问题:Antd4.x版本和5.x版本中DatePickervalue类型分别是:moment对象和dayjs对象类型,但通常提交表单时候,后端一般都要求是日期字符串格式“2022-08-09”这样;普遍的做法是在提交表单onFinish方法里对表单提交参数进......
  • 塔猫 | Python 日期时间格式化输出,带年、月、日、时、分、秒
    #依赖:importtime|用于:批量文件名后缀(4位浮点秒数,应该没人猜到,当做随机数)defftime(f=''):iff=='-':returntime.strftime('%Y-%m-%d%H:%M:%S',time.localtime())iff=='':timeStamp=time.time()ends......
  • 提升集群吞吐量与稳定性的秘诀: Dubbo 自适应负载均衡与限流策略实现解析
    作者:刘泉禄整体介绍本文所说的“柔性服务”主要是指consumer端的负载均衡和provider端的限流两个功能。在之前的Dubbo版本中,负载均衡部分更多的考虑的是公平性原则,即consumer端尽可能平等的从provider中作出选择,在某些情况下表现并不够理想。而限流部分只提供了静态的限......
  • 提升集群吞吐量与稳定性的秘诀: Dubbo 自适应负载均衡与限流策略实现解析
    作者:刘泉禄整体介绍本文所说的“柔性服务”主要是指consumer端的负载均衡和provider端的限流两个功能。在之前的Dubbo版本中,负载均衡部分更多的考虑的是公平性原则,即consumer端尽可能平等的从provider中作出选择,在某些情况下表现并不够理想。而限流部分只提供了静态......
  • 计算机网络实验 实验5 运输层和应用层协议解析
    实验5运输层和应用层协议解析一、实验目的  本实验通过运用Wireshark对网络活动进行分析,观察TCP协议报文,分析通信时序,理解TCP的工作过程,掌握TCP工作原理与实现;学会运用Wireshark分析TCP连接管理、流量控制和拥塞控制的过程,发现TCP的性能问题。二、实验内容任务1:TCP正常......
  • 挂载NTFS磁盘,修复磁盘,格式化磁盘时一直失败怎么办?
    NTFSDiskbyOmiNTFSforMac是一款NTFS磁盘管理器,支持在Mac电脑上读写NTFS格式的磁盘。它允许用户访问存储在NTFS磁盘上的文件,而无需重新格式化磁盘或使用USB驱动器或云存储等文件传输方法。有朋友反映,挂载NTFS磁盘,修复磁盘,格式化磁盘时一直失败怎么办?下面就和小编一起来看......
  • Onetable:统一的表格式元数据表示
    概括Onehouse客户现在可以将他们的Hudi表查询为ApacheIceberg和/或DeltaLake表,享受从云上查询引擎到顶级开源项目的原生性能优化。在数据平台需求层次结构的基础上,存在摄取、存储、管理和转换数据的基本需求。Onehouse提供这种基础数据基础架构作为服务,以在客户数据......
  • JWT控制返回数据格式
    1.只使用JWT的局部校验,不加权限控制的不会限制用户登录  2.JWT的局部校验配合权限控制提供用户登录访问限制  2_1.JWT的局部校验配合权限控制提供用户登录访问限制  3.重写jwt_response_payload_handler方法,创建utils文件,自定义返回格式  4.重写jwt_respo......