IM 通信协议主题 10 了解节俭序列化协议

小夏 科技 更新 2024-01-31

本文由字节跳动技术团队成员杨晨曦分享,本文经修订修改。

本文将带大家初步了解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 定义如下:

接口。

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"]

现象:服务 A 访问服务 B,业务逻辑在短时间内处理完毕,但整个请求在 15 秒内超时。

直接原因:修改了 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

本文发表于:

相似文章

    IM即时通讯的私有化部署支撑信息创新环境

    即时通讯软件系统具有强大的社交功能,用户可以通过查找和添加朋友来建立自己的社交网络。他们可以更新自己的个人资料,分享故事和发布状态,并与朋友分享他们的生活。同时,用户还可以参与群组和社区,与志趣相投 话题相同的人进行交流互动,扩大社交圈。此外,即时通讯软件系统还提供有用的辅助功能,例如语音翻译 模因...

    IM(即时通讯聊天工具)是一篇要了解、技术栈和界面设计的文章

    大家好,我是伯格前端工厂,本期继续分享IM 即时通讯 的设计,欢迎大家关注。IM即时通讯工具是指用于实时通信和通信的一类软件或应用程序。它们通过互联网或局域网等网络连接,并提供文本 语音 图像和 等实时通信功能。IM即时通讯工具可以在PC 智能手机 平板电脑等设备上运行,支持一对一或多人群聊。一些常...

    一种分布式IM即时通讯系统的技术选型与架构设计

    本文由冰河分享,由博客冰河撰写gitcode.主持人,原来的问题 如何在简历上写这个分布式IM即时通讯系统?我已经帮你整理好了!本文档已经过修订和修改。分布式IM即时通讯系统本质上是对在线聊天和用户的管理。对于聊天本身,核心要求是 发送文本 文件 语音 消息缓存 消息存储 消息未读 已读 召回 离线...

    Web端IM产品RainbowChat Web的v6 0版本已经发布

    RainbowChat Web是一个web即时通讯系统,是RainbowChat的姊妹系统 RainbowChat是基于开源即时通讯聊天框架MobileIMSDK GitHub地址 的生产级移动即时通讯系统 详 版本历史记录 运行屏幕截图 跑 此版本中的新增功能 更多历史更新日志 bug serve...

    IM 32EA绝缘监测模块有哪些特点?

    IM EA绝缘监测模块是一种用于监测电气系统绝缘状态的设备。它可以实时监测电气系统的绝缘电阻值,并在绝缘电阻值低于设定阈值时发出警报,以确保电气系统的安全运行。该模块具有以下特点 高精度测量 采用先进的测量技术,可准确测量电气系统的绝缘电阻值。实时监控 可实时监控电气系统的绝缘状态,及时发现潜在的绝...