春争日,夏争时,扫码抽取夏日礼包!!! 了解详情
写点什么

SuperPack——实现更小负载的新序列化格式

  • 2016 年 9 月 01 日
  • 本文字数:1834 字

    阅读完需:约 6 分钟

Shape Security 开源了一个新的无模式二进制序列化格式,名为 SuperPack

SuperPack 使用了二进制的序列化模式,这意味着会减少负载的大小。按照 Shape Security 的说法,对于一个给定的4.48 KB 的样例信息,相对于多个其他的无模式格式,SuperPack 的负载是最小的:

原始信息 YAML BSON
JSON Sereal SuperPack 非压缩 4.769 B 134% 111% 69% 40% 28% 压缩 4.769 B 14% 20% 12% 16% 13%YAML 和 BSON 非常冗长,会增加消息的负载。JSON 比 YAML 要好得多,但是因为它基于文本编码格式,所以它的大小依然会远远超过 SuperPack。在gzip压缩之后,它们的值会出现比较大的差异,YAML、JSON 和 SuperPack 的值非常接近,是原始消息的 12-14%。

采用 SuperPack 编码格式的一个主要优势在于,与客户端通信的时候不需要预先交换消息的模式。数据类型的信息会包含在负载之中。SuperPack 有 36 个预先定义的数据类型,包括常见的true、false、uint16、uint32、float32,也包括不那么常见的类型,如 uint6 nint4 array5等,这些类型能够代表消息中很可能出现的值。

SuperPack 还包含了针对数组、字符串以及 map 的类型。其中还有个类型是 extension,它能够让用户添加新的类型。SuperPack 还有两个可选的优化选项,能够减少特定场景下的负载:_ 重复字符串优化(repeated string optimization)以及_ 重复keyset 优化(repeated keyset optimization)

我们采访到了Michael Ficarra,他是一名研究工程师和自由/ 开源软件协调人员(FOSS Coordinator),了解到了SuperPack 的更多细节。

InfoQ:在编码后,你们的负载会更小,相对于其他的无模式格式,你们的做法有何不同呢?

MF: SuperPack 有其背后的哲学,那就是即便我们不能预先推测出数据的模式,但数据中的结构或值很可能会重复出现很多次。举个例子,假设有个名为“cats”的数据结构,它将每个人与他的猫关联在了一起。我们不是直接进行编码,考虑到每只猫都有名称、生日以及喜欢的食物,我们只对其编码一次,稍后会对其进行引用,对这些值采用了非常高效的 protobuff 风格的打包方式。

另外,有些值比其他的值更为通用,应该有更为高效的表述形式。如果你看一下格式的详细描述的话,你会发现所有的值都由一个单字节的指示符打头,它用来表明值的类型,我们将其称之为“类型标签(type tag)”。在类型标签域中,我们预留了一部分区域范围,这样的话,值的全部或部分内容就可以在标签本身中进行编码。举个简单的例子,有两个 boolean 类型标签:一个用于值 true,另一个用于值 false。类似的,还有 64 个“uint6”类型标签,允许我们使用一个字节就能表示 0 到 63 之间的每个数字,另外,对于条目长度小于 32 的数组(必须要同时对它的长度和条目进行编码),可以将它的长度编码到标签中。回到前面的例子中,猫的胡须通常不会多于 64 根并且大多数人所养的猫不会超过 32 只,因此这些值能够非常高效地进行存储。

InfoQ:你们将 SuperPack 与模式驱动的二进制格式进行过对比吗,比如 Protocol Buffers?Protobuf 的负载会明显更小吗?

MF:我们没有进行过这种类型的对比。我认为,在大多数场景下,Protobuf 的负载会更小,除非 SuperPack 的字符串去重功能能够特别有效。当你的需求允许你使用模式驱动格式的话,尤其是能够与某种无损数据压缩算法(如 LZW 或 Deflate)结合使用时,那么你就应该采用这种方案。

InfoQ:在消息的编码 / 解码上所消耗的时间是怎样的?

MF:根据编码器是否启用可选的 keyset 和字符串去重优化功能,编码时间会有所差异。在实现语言层面,也会有一些遗留的性能难题,比如 JavaScript 针对所有的数字都使用了 IEEE 754 的双精度形式。

InfoQ:你们有支持其他语言的计划吗?

MF:当然!我们已经有了一个 Java 实现,目前,这个实现我们在 Shape Security 内部使用。它还没有为开源做好准备,但是如果我们听到有这种需求的话,就会加快这一进程。如果社区希望为另外的生态系统启动新实现的话,我也是非常乐意提供帮助的。我觉得 Rust 实现将是非常令人兴奋的!

另外,值得一提的是,SuperPack 依然非常年轻,如果读者对于它的提升有什么建议的话,我们非常乐意倾听,只需在规范的 issue tracker 上开启一个 issue 即可。我们希望将来版本的 SuperPack 会更棒!

目前,SuperPack 自带了一个 JavaScript 转码器,但是其他的转码器可以基于它来进行开发。SuperPack 是开源的,并且采用了非常宽容的许可证协议

查看英文原文 SuperPack, a New Serialization Format with a Smaller Payload

2016 年 9 月 01 日 19:001496

评论

发布
暂无评论
发现更多内容

架构实战营 模块二 作业

一雄

作业 架构实战营 模块二

深入了解Spring之MessageSource

邱学喆

MessageFormat MessageSource MessageSourceAware

架构实战营模块二作业

王晓宇

项目管理实践篇(一):技术人如何做好风险把控

后台技术汇

项目管理

夏季小伙伴们注意安全

IT蜗壳-Tango

7月日更

Python 正则表达式急速入门

喵叔

7月日更

Liunx之chown命令

入门小站

Linux

架构实战营第二周作业——微信朋友圈高性能复杂度

发酵的死神

架构实战营

Spark :: 源代码(前传)—Spark多线程 :: NettyRpcEnv.ask解读

dclar

spark 多线程 Spark调优 源代码

华为18级工程师耗时三年才总结出这份Java亿级高并发核心编程手册

Java 编程 程序员

模块2作业

Tina

微服务架构服务容错设计分析

慕枫技术笔记

微服务 后端 架构·

北鲲云计算,用技术成就生物科学领域发展

北鲲云

🐧【Linux技术专题系列】「必备基础知识」一起探索(su、sudo等相关身份提权/身份切换机制)

浩宇天尚

Linux linux 文件权限控制 7月日更 Linux身份提权

golang解析---进程,线程,协程

en

线程 进程 协程 Go 语言 goroutine

模块-6 拆分电商系统为微服务

小遵

vivo S系列的爆款密码:自拍,自然,自出机杼

脑极体

OLAP 扫盲

Galaxy数据平台

OLAP 高基数

JDBC数据库链接的那些事

卢卡多多

JDBC 7月日更

Discourse 调整使用不同的表情符号

HoneyMoose

【Flutter 专题】84 图解自定义 ACEWave 波浪 Widget (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

分布式事务最经典的七种解决方案

叶东富

数据库 分布式事务 微服务 TCC Go 语言

模块一作业

A先生

智能运维(AIOps)系列之四:智能运维落地的思路

micklongen

AIOPS 智能运维

要性能还是要模型?

escray

学习 极客时间 7月日更 如何落地业务建模

Spark SQL和DataFrames:内置数据源简介(四)

数据与智能

spark sparksq

一文搞懂二分查找面试

泽睿

算法 二分查找

模块-1 微信业务架构图 和 备选方案

小遵

金九银十马上要来了,我熬夜整理10 万字节详细面试笔记(带完整目录) 良心分享

Java 编程 程序员 架构 面试

2021年网络安全市场全景图,看看都有哪些企业吧!

郑州埃文科技

八位阿里大牛耗时三年总结出Java面试复盘手册!带你实现逆风翻盘

白亦杨

Java 编程 程序员

SuperPack——实现更小负载的新序列化格式_JavaScript_Abel Avram_InfoQ精选文章