《第四章.数据编码与演化》 作者: nbboy 时间: 2022-05-17 分类: 软件架构,软件工程,设计模式,Golang ### 数据编码用处 数据编码主要被用在数据传输和存储上,至于数据在内存中是不需要特定的数据编码的,用某种结构就可以表示(比如数组,链表,数,图等等),平时接触最多的可能就从数据库反射回来的数据模型对象。 ### 数据编码困境 数据编码即可以是通用的数据编码也可以是语言专用的数据编码,比如大家都知道的XML,JSON,PB是通用的数据编码,任何的语言基本都可以编码和解码。对于专有数据编码,比如Python Pickle文件和Java序列化等都属于这类,一般被用来存储的用途。 但是无论对于哪种数据编码,主要需要解决的问题是: - 保持双向兼容(前向和后向) - 快速的编码和解码 - 数据是否紧凑 - 最好对人类友好,即便于调试 以比较熟悉的JSON和PB进行描述和对比,JSON并没有保持双向兼容的能力,需要程序去自行处理。从性能上来说,相对于其他二进制编码,它无疑编解码也是比较慢的,而且因为是文本格式,所以数据也不具有太好的压缩特性。但是因此带来的好处是方便我们去调试,比如可以很方面的截获一段HTTP报文,我们完全不借助工具就可以阅读他的内容,这是其他二进制编码格式做不到的。所以正是这些因素,外网常用的接口都以Restful风格+JSON编码去传输。但是,PB正好相反,它可以预定义模式协议文件(pb文件),而且支持可选和必选,这样就为双向兼容提供了方便。PB编解码性能比JSON快了非常多,另外数据更加紧凑,不过由于以上特性,如果不借助工具,不方便调试。 以上描述的两种编码格式比较常见,也比较有代表性。不存在最好的和具备所有优点的编解码方式,需要我们根据具体场景去选择,比如目前比较好的实践方式是,走外网的接口通常用JSON去传输,内网的RPC服务用的更多的还是PB格式。 ### 数据流模式 在Web应用开发中,一般和数据库,消息队列,调用第三方服务打交道,书中总结抽象为数据流。 - 数据库也可以看成编解码的过程,把SQL的记录行组装成模型对象(不是领域对象)称为解码,把模型对象拼装成SQL语句执行的过程称为编码。消息队列和服务调用过程中更加少不了编解码。 - RPC和Restful在交互过程中对内容进行编解码 - 异步消息在投递到消息代理过程中会进行编解码 ### 总结 数据在存储和传输过程中需要进行编解码,在一些特殊的场景会自己定义一套编解码方式,目标是更好的性能和更具经凑的格式。当然当然在Web开发中,用的最多的还是JSON和PB,以后肯定会有更多的方案出现,但是都应该围绕上面提到的几个目标去设计。 标签: DDA, 密集型系统设计