本文由字节跳动技术团队成员杨晨曦分享,本文经修订修改。本文将带大家初步了解Thrift的序列化协议,包括Binary协议、紧凑协议(类似于ProtoBuf)、JSON协议,希望能为大家的通信协议格式选择提供参考。
本文是下面总结的系列文章中的第 10 篇
IM通信协议专题研究(1):pRotobuf从初学者到精通,一篇文章就够了!》
IM通信协议专题(二):快速了解PROTOBUF的背景、原理、用途、优缺点
IM通信协议专题(3):从浅到深,从根源理解PROTOBUF编解码原理”。
IM通信协议专题(四):从Base64到Protobuf,详解Protobuf的数据编码原理
IM通信协议专题研究(5):p快多少倍Rotobuf 比 JSON 更?全方位测量!》
IM通信协议专题学习(六):教你在Android上从零开始使用Protobuf
IM通信协议专题(七):教你在NodeJS中从零开始使用Protobuf
IM通信协议专题(八):金蝶手写团队Protobuf应用实践(原理)
IM通信协议专题研究(9):教你在iOS上从零开始使用Protobuf
IM通信协议专题(10):节俭序列化协议的入门(*本文)。
另外:如果您还打算系统地学习 IM 开发,我们建议您阅读“初学者入门:从头开始开发移动 IM”。
Thrift 是 Facebook 开源的高性能、轻量级 RPC 服务框架,是包含序列化和服务通信能力的全栈 RPC 解决方案,支持跨平台、跨语言。
Thrift的整体架构如图所示:
Thrift软件栈定义清晰,各层组件松耦合可插拔,可根据业务场景灵活组合。
如图所示
节俭本身是一个比较大的话题,本文不会涵盖节俭的全部内容,只介绍其中的序列化协议。
下面是如何可视化二进制消息格式的示例。
IDL 定义如下:
接口。现象:服务 A 访问服务 B,业务逻辑在短时间内处理完毕,但整个请求在 15 秒内超时。service supservice ,.
例。 map */
数": {
map": [
密钥类型","值的类型"、元素数、"密钥 1","值 1",..
键 n","值 n"
例。 map": [
i64","str",1,666,"mapvalue"
list */
数": {
set/lst": [
值的类型"、元素数、"ele1","ele2","elen"
例。 lst": [
str",2,"lark","keyword"]
直接原因:修改了 idl 类型;并且只升级了服务器端(服务 B),客户端(服务 A)没有升级。
主要原因:string 是可变长度编码,i64 是固定长度编码。 由于客户端尚未升级,因此在反序列化时,signtime 将被解析为字符串类型。 可变长度编码处于 t-l-v 模式,因此在解析时,低 4 字节的 signtime 将转换为字符串的长度。
signtime 是一个时间戳,一个大整数,例如 1624206147902,转换为二进制,如下所示:
下面的 4 个字节转换为十进制,如下所示:也就是说,另外 378 个字节被读取为签名时间的值,该值已经超过了整个有效负载的大小,并最终导致套接字读取超时。
注意:修改类型不一定会导致超时,但如果值的值很小,则解析值的长度也很小,因此可以在一定程度上读取。
但是不正确的解析可能会导致各种意外情况,包括:
乱码;
零;
错误:报告未知数据类型 xxx(跳过异常)。
1) 添加字段:
跳到跳过添加的字段以确保兼容性。
2) 删除字段:
编译后的解析器是基于字段 id 的切换大小写结构,直接兼容语法结构。
3)修改字段名称:
它不会破坏兼容性,因为二进制协议不对名称进行编码。
节俭有两个例外:
一个是框架中内置的异常
一种是 IDL 定义的异常。
框架中内置的例外情况包括:
方法名称不正确;
消息序列号不正确;
协议错误。
这些异常由框架捕获并封装到异常消息中,这些消息被反序列化为错误并抛出到上层。
逻辑如下:
另一种类型的异常是 IDL 中用户定义的,关键字是 exception,与 struct 没有太大区别。
可选表示该字段是可选的,require 表示该字段是必需的。
将字段标识为可选字段后:
基类型被编译为指针类型;
序列化将确定 null 值,如果字段为空,则不会对其进行编码。
之后,该字段被标识为必填字段:
原始类型被编译为非指针类型(复合类型可选与要求无异);
序列化不确定 null 值,并且必须对字段进行编码。 如果没有显式赋值,则对默认值进行编码(默认 null 值,或 IDL 显式指定的默认值)。
1] Protobuf 从初学者到精通,一篇文章就足够了!
2] 如何选择即时通讯应用程序的数据传输格式。
3] 强烈建议使用 protobuf 作为您的即时通讯应用程序数据传输格式。
4] 应用程序和后端之间数据格式的演变:从文本协议到二进制协议。
5]面试必考,史上最流行的大端和端。
6] 移动IM开发需要面对的技术问题(包括通信协议选择)。
7] 简要描述移动 IM 开发的陷阱:架构设计、通信协议和客户端。
8] 理论与实践:对一组典型的 IM 通信协议设计的详细说明。
9] 58 家庭实时消息系统协议设计等技术实践分享。
10] 金蝶笔记团队Protobuf应用实践(原理)。
11] 初学者一篇文章就够了:从零开始开发移动IM
本文发表于: