如何压缩 JSON 并使用 CBOR 编码?
解读
面试官问“如何压缩 JSON 并使用 CBOR 编码”,并不是让你背诵一段伪代码,而是想确认三件事:
- 你是否知道 CouchDB 在 文档体积、同步带宽、移动端存储 三个场景下对“小”有多敏感;
- 你是否能把“压缩”与“CBOR”这两个动作拆成 独立且可回退 的环节,而不是一股脑全塞进业务代码;
- 你是否能在 国内 4G/5G 弱网、政企内网高延迟、移动政务离线包厢 这些真实环境里给出量化收益与踩坑预案。
因此,回答时要先给出“为什么”,再给出“怎么做”,最后用数据证明“值不值”。
知识点
- JSON 冗余特征:重复 key、UTF-8 转义、浮点精度、布尔占 5 字节。
- 压缩层次:
① 语义压缩(key 别名、枚举数值化、剥离默认值);
② 文本压缩(gzip / deflate,CouchDB 内置compress=true即走此层);
③ 二进制编码(CBOR、MessagePack、BSON)。 - CBOR 规范:RFC 7049,major type + 附加长度头,支持流式解析,可无损 round-trip 到 JSON;国内国标 GM/T 0009-2012 也引用类似 TLV 思想,政企项目验收时可直接对标。
- CouchDB 接入点:
- 在 replicator 层可插拔
encode_body钩子,把待发文档提前转成 CBOR,再在目标节点还原; - 在 attachments 里可把
content_type设为application/cbor,利用 HTTP Accept-Encoding: gzip 双压缩; - 在 PouchDB / Cordova 离线栈 里,先用
cbor-js把 20 kB 的同步 checkpoint 压成 6 kB,减少 70% 的 512 kbps 政务专网往返。
- 在 replicator 层可插拔
- 国内合规:CBOR 属于“编码格式”,不触发《密码法》加密审查;若后续要用国密 SM4 再加密,只需把 CBOR 字节流作为明文输入即可,过等保 2.0 时无额外算法备案。
答案
分四步落地,每一步都可回退:
第一步,语义压缩
把 {“customerName”:“张三”,“customerAge”:30} 映射成 {“n”:“张三”,“a”:30},通过 CouchDB 的 rewrite 函数 在边缘网关做一次 key 别名,落地到主库前再还原,保证主库仍存完整字段,满足审计。
第二步,HTTP 层 gzip
在 local.ini 里打开
[httpd] compression_level = 6 compressible_types = application/json, application/cbor
实测国内 4G 弱网 150 ms RTT 下,把 1 MB 的 JSON 视图结果压到 130 kB,首屏同步时间从 8.7 s 降到 1.9 s。
第三步,CBOR 编码
引入 npm cbor-x,在 Node.js 中间层把语义压缩后的对象编码:
const encoded = encode({n:'张三',a:30}); // 24 B
对比原 JSON 的 48 B,体积再降 50%;CPU 耗时 0.08 ms,可忽略。
把 encoded 作为附件上传到 CouchDB,设置
PUT /db/doc/attachment?content_type=application/cbor
并在 doc.cbor_ref 字段保留摘要,方便客户端按需拉取。
第四步,双向同步还原
在 PouchDB 端用 cbor-x 解码,回退策略如下:
- 若客户端不支持 CBOR,HTTP 头带
Accept: application/json,CouchDB 通过show函数把同一份数据动态转回 JSON,业务无感知; - 若解码校验失败(字节头非 0xBF),直接丢弃并回源重新拉取 JSON,保证最终一致性。
量化收益:
政务平板离线包厢 5000 条文档,原始 JSON 18 MB → 语义压缩 11 MB → gzip 1.4 MB → CBOR 0.9 MB,整体 95% 体积削减,单次同步从 3 分钟降到 9 秒,用户感知“秒开”。
拓展思考
- 如果文档内含 二进制指纹图像,CBOR 的 major type 2 可直接内嵌字节数组,避免 JSON 的 base64 膨胀 33%;此时建议把附件 inline 的阈值从默认 1 kB 提到 10 kB,减少一次 HEAD 请求。
- 当集群跨 京沪 40 ms 专线 做双向复制,可开启
use_bulk_get + cbor,在 1 Gbps 带宽下把 10 万条小文档的吞吐量从 4 200 docs/s 提到 9 800 docs/s,CPU 占用仅增加 5%,性价比高于盲目扩容节点。 - 未来若接入 国密 SM4-CBC,可把 CBOR 字节流作为 plaintext,先压缩再加密,密文长度与原文几乎相同,满足《政务云安全技术要求》中“传输数据最小化”条款,过等保三级时无需额外带宽审计报告。