最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

软件系统开发中的数据交换协议

  • 2011-05-08
  • 本文字数:2101 字

    阅读完需:约 7 分钟

在很多地方都有“数据交换”这个概念,本文所说的“数据交换” 是指在计算机网络中,一个系统把数据传递给另外一个系统。这非常类似于一个人要告诉另外一个人一件事情。

当一个人要把一件事情告诉另外一个人的时候,我们可以通过电话、邮件、短信、IM 工具或者当面说的方式来交流。这种方式类似于系统数据交换要通过 tcp、udp、管道等等的方式实现。当两个人交流的时候,我们需要一种共同的语言才能明白对方的意思,同样的,两个系统要交换数据,也需要定义一种双方都明白的协议,我们称为“数据交换协议”。

数据交换协议

数据交换协议的目的是让两个系统进行正确的数据交互。所以几乎各种开发语言都提供了方便使用的数据交换功能。比如说使用 JAVA 语言的开发的系统使用 MySQL 数据库存储数据,就是通过 MySQL 数据交换协议跟 MySQL 做数据交换;通过 JAVA 的 RMI 可以方便的做跨机器的分布式数据交换,RMI 也就是一种数据交换协议。

一般我们在不同的系统、不同的语言之间交换数据的时候,我们会选择一种通用的交换协议或者自己定义一种容易使用的交换协议。 WebService 曾经非常流行, 在 Web 2.0 时代,轻量级的 REST 协议又开始受到追捧。那么究竟在我们的系统中应该选择什么样的协议呢?

如何选择数据交换协议

选择什么样的协议跟我们的应用场景有很大的关系。我们需要考虑我们开发是否方便、接口是否容易发布、是否需要考虑带宽占用成本、序列化和反序列化的性能、接口协议的扩展性等等。下面我们看下几个比较常用的交换协议实现。

协议 实现 跨语言 性能 传输量 RPC xml 广泛 几乎所有 低 很大 N(可实现) json 广泛 大量 一般 一般 N(可实现) php serialize PHPRPC 大量 一般 一般 Y hessian hessian 大量 一般 小 Y thrift thrift 大量 高 小 Y protobuf protobuf 大量 高 小 N(可实现) ice ice 大量 高 小 Y avro Apache Avro 少量 高 小 Y messagepack messagepack 大量 高 小 Y 上面表格列出了一些常用数据交换协议的一些特性的比较。这里并没有比较好坏,只是想说明不同数据交换协议是有区别的,所以我们需要在我们的应用场景中进行选择。

开放式

像微博,SNS 这种开放平台、对静态 html 页面提供 javascript 接口调用的系统都属于这种类型 。这种类型的特点是:

  • 调用方不完全可控,而且是针对公网的,你可能不知道是谁、是什么语言、是什么方式在调用你提供的数据接口;
  • 接口访问量一般都非常大,要求具有很高的性能和吞吐量;
  • 需要考虑安全问题,外部提交的数据可能不是合法的。

所以在这种情况下,需要考虑数据传输的带宽消耗和数据交换协议的易用性,以及多语言支持程度。以前对于 html 页面使用的 javascript 接口调用一般都使用 XML 格式,最近几年几乎都转成了 json 格式了,因为 json 传输量更小,比 XML 更加容易使用。 而对于开放平台,由于使用的场景很多,所以需要提供多种交换协议格式。基本上都会提供 XML 和 json。为了提高平台本身的性能和客户端的性能,也可以提供 protobuf 这种二进制交换协议并且增加压缩支持,以节省带宽传输和解析的性能消耗。

内部服务

对于一个大型系统来说,内部服务的数据交换无处不在。从最基本和常见的数据库数据交换、memcached 缓存数据交换、消息队列的数据交换到系统之间使用的 RPC 服务框架等等,都可以算作内部服务的数据交换。内部服务的特点是不用考虑防火墙,不对外开放,速度快(基本无带宽成本)。

内部服务的数据交换协议的选择空间非常大,一般需要考虑:

  • 数据交换协议的性能
  • 是否需要跨语言支持
  • 数据交换协议的消息体大小

持久化存储

对于持久化存储来说,每一种数据交换协议其实都可以实现。一般需要根据应用场景考虑:

  • 是否人工可阅读
  • 存储的空间消耗
  • 序列化和反序列化的性能
  • 是否经过压缩

跨语言

假设我们的网站前端页面展示层使用 PHP 语言开发,中间业务逻辑使用 JAVA 语言开发,那么就涉及到跨语言数据交换的问题。只要系统不是单纯的使用一种语言,那么就必须考虑这个问题。事实上,考虑未来的扩展和需求变化问题,也最好考虑跨语言的数据交互协议。

数据交换协议可升级

在选择数据交换协议的时候,我们同样需要考虑类似于数据库表的?schema 设计时的扩展问题。比如一个提供用户信息的数据交换协议接口,现在包含用户名、性别、住址的信息,在升级过程中,增加了一个最后登录的 IP 信息。如果不考虑数据交换协议升级带来的影响,很可能会导致以前的客户端出现异常或者旧的数据无法正确解析的问题。

兼容协议的巧用

兼容协议的巧用非常有用,新产品兼容提供现有成熟的数据交换协议,可以降低使用门槛和产品的开发速度。比如新浪开源的 memcacheQ 就使用了 memcached 协议。

总结

数据交换协议的各种通用开源实现非常多,数据交换协议只是一个非常宽泛的说法,其实只要实现了数据的序列化和反序列化 ,那么就可以说是一个可以交换数据的协议。数据交换协议的性能其实就是序列化和反序列化的性能,如果加上 RPC,那么跟 RPC 实现本身的性能也有非常大的关系。

我的新浪微博 @sunli1223 , 欢迎与我讨论。

参考链接:

2011-05-08 21:387933

评论

发布
暂无评论
发现更多内容

行业首个测试开发技术大赛开始报名啦~ 10万现金奖励等你来挑战

测吧(北京)科技有限公司

软件测试

HDC.Cloud Day | 全国首场上海站告捷,聚开发者力量造梦、探梦、筑梦

华为云开发者联盟

云计算 华为云

小令观点 | 急需身份证扫描件?【A4证照扫描王】来帮你

令牌云数字身份

软件推荐 入职 打印 证照扫描

Docker搭建私有registry镜像仓库

蜗牛也是牛

简述SpringAOP的实现原理

千锋IT教育

开源|ftlog升级啦!功能更强,性能更高,细节更极致

非凸科技

前端培训后的学习方法有哪些

小谷哥

大数据培训的就业前景怎么样

小谷哥

被性能优化撂倒无数次后的顿悟!465页调优笔记助力大厂面试之旅

程序知音

Java JVM 性能调优 java架构 后端技术

PG SQL 语法汇总

蜗牛也是牛

数据库索引相关和EFCore的索引映射

C++后台开发

数据库 后端开发 Linux服务器开发 C++开发 数据库索引

Wallys//IPQ6010/IPQ6018/IPQ6000/industrial wifi6 router/DFS/M.2/ 2x2 2.4GHz/5GHz

wallysSK

IPQ6010 ipq6018 IPQ6000

从保险系统升级谈微服务架构的弊端

勇士

外包 微服务 系统架构 保险 运维开发

三个经典的MySQL问题

千锋IT教育

【Go】力扣 - 剑指 Offer 第五天 - 二维数组中的查找

陈明勇

Go 数据结构与算法 力扣 11月月更

1000道最新高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构!

程序知音

Java Java 面试 大厂面试 java架构 后端技术

比ZeroTier更适合国内使用的异地组网方案,你还不知道?

科技热闻

深入浅出学习透析Nginx服务器的基本原理和配置指南「Https安全控制篇」

洛神灬殇

nginx https ssl 11月日更 SSL/TLS 协议

Python3.10的开发环境的搭建

千锋IT教育

Serverless 的前世今生

阿里巴巴云原生

阿里云 Serverless 云原生

华为云智能云接入ICA,助力企业轻松上云

科技怪授

低代码平台中的“模型驱动”与“表单驱动”有何区别?

优秀

领域驱动模型DDD 中台架构 表单设计 低代码平台

前端培训入行35岁程序员有什么奔头

小谷哥

cdr2023最新试用版下载CorelRAW2023

茶色酒

CorelRAW2023

真相了!GitHub不光能学代码,还有这些...

程序员小毕

GitHub 程序员 架构 面试 程序人生

前端培训班学习真的靠谱吗?

小谷哥

一个关于X证券20000台服务器的血泪故事

青藤云安全

网络安全 青藤云安全

首份关基安全国标刚发布,客户把我叫到了办公室......

青藤云安全

网络安全 青藤云安全

基于云原生网关的可观测性最佳实践

阿里巴巴云原生

阿里云 微服务 云原生 可观测

Doris Summit 2022 正式启航,演讲议题开启征集

SelectDB

开源 Doris 峰会 summit SelectDB

出海有“云”!华为云全球加速助力跨国企业提升网络体验

科技怪授

软件系统开发中的数据交换协议_Java_孙立_InfoQ精选文章