编码&解码 or 序列化&反序列化在哪里需要:
1、跨进程通信,一端数据对象编码,网络传输;另一端接受数据,解码对象
2、内存和磁盘上的数据转换,内存编码,写磁盘;读磁盘,内存解码
编解码涉及的问题:
1、节省空间,提高性能
2、兼容,向前兼容:新代码能够读到旧数据;向后兼容:旧代码可以读到新数据
其中兼容性很重要,对于服务端,可以滚动灰度升级;对于客户端,必然要保证客户端的兼容性
编码数据的格式
程序中至少使用两种类型的数据:
1、内存中,数据保存在对象中,结构体,列表,数组,哈希表,树等中。一般通过指针高效操作
2、网络或者磁盘中,将数据编码成某种字节序列
语言特定的格式
java、python中内置编解码的库,但是有如下问题:
1、和特定语言绑定
2、安全问题
3、兼容性不好
4、效率不高
JSON、XML等基于文本的编码方式
好处:可读性好
坏处:
1、效率不高
2、占空间
3、对二进制和高精度数值类型不支持
二进制编码
好处:紧凑、高效
例子:MessagePack、BSON、BJSON等等
Thrift与Protocol Buffers
兼容性好
字段标签和模式演变
随着时间推移,不可避免的增删字段、修改字段,即模式演变。要保持兼容性
数据类型和模式演变
数据类型的演变需要兼容,否则会丢失精度
Avro
没用过,不了解
数据流的类型
数据库的数据流
服务中的数据流:REST和RPC
rpc的问题:
1、rpc调用不可预测,可能会返回各种不同的错误,需要错误处理
2、rpc需要处理超时错误,对于某些服务需要保证幂等
3、rpc需要编解码,在大对象时,可能会有性能问题
消息传递中的数据流
优点:
1、如果收件人不可用或过载,可以充当缓冲区,从而提高系统的可靠性。
2、它可以自动将消息重新发送到已经崩溃的进程,从而防止消息丢失。
3、避免发件人需要知道收件人的IP地址和端口号(这在虚拟机经常出入的云部署中特别有用)。
4、它允许将一条消息发送给多个收件人。
5、将发件人与收件人逻辑分离(发件人只是发布邮件,不关心使用者)。