软件系统开发中的数据交换协议
在很多地方都有“数据交换”这个概念,本文所说的“数据交换” 是指在计算机网络中,一个系统把数据传递给另外一个系统。这非常类似于一个人要告诉另外一个人一件事情。
当一个人要把一件事情告诉另外一个人的时候,我们可以通过电话、邮件、短信、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 ,欢迎与我讨论。
参考链接:
- java序列化和反序列化性能比较:https://github.com/eishay/jvm-serializers/wiki
- Java跨语言调用实现方案 http://rdc.taobao.com/team/jm/archives/389
关于作者
孙立,目前为去哪儿网(qunar.com)高级系统架构师。曾就职于凤凰网、ku6和搜狐。多年互联网从业经验和程序开发,对分布式搜索引擎的开发,高并发,大数据量网站系统架构优化,高可用性,可伸缩性,分布式系统缓存,数据库分表分库(sharding)等有丰富的经验,并且对运维监控和自动化运维控制有经验。是开源项目phplock,phpbuffer的作者。近期开发了一个NOSQL数据库存储INetDB,是NoSQL数据库爱好者。
本文已经首发于InfoQ中文站,版权所有,原文为《 软件系统开发中的数据交换协议》,如需转载,请务必附带本声明,谢谢。
InfoQ中文站是一个面向中高端技术人员的在线独立社区,为Java、.NET、Ruby、SOA、敏捷、架构等领域提供及时而有深度的资讯、高端技术大会如QCon 、线下技术交流活动QClub、免费迷你书下载如《架构师》等。
软件系统开发中的数据交换协议相关推荐
- 软件开发中的几种数据交换协议
在很多地方都有"数据交换"这个概念,本文所说的"数据交换" 是指在计算机网络中,一个系统把数据传递给另外一个系统.这非常类似于一个人要告诉另外一个人一件事情. ...
- 数据交换协议--JSON、XML、YAML、TOML、TLV
数据交换协议--JSON.XML.YAML.TOML.TLV 1 数据交换协议 2 常用协议 2.1 JSON 介绍 示例 2.2 XML 介绍 示例 2.3 CSON 介绍 示例 2.4 TOML ...
- 协议开发 中移动CMPP2.0协议API(三)
协议开发 中移动CMPP2.0协议API(三) 云网(jimzj@21cn.com) 接上篇... 五.发送接口 对于API来说,最重要的一部分就是去做发送数据了.通过SOCKET套接字与网关相连接后 ...
- 计算机网络FMD是什么,计算机网络中的数据交换
计算机网络中,数据交换的类型有:电路交换.报文交换.分组交换. ☞数据交换--电路交换 Q:如何实现数据通过网络核心从源主机到达目的主机? A:数据交换.(现在网络主要采用的技术是数据交换) 2台主机 ...
- LIS常用数据交换协议
一.私有交换协议 仪器厂商自定义的数据交换协议,通用性差. 1.ASTM协议介绍 2.ASTM 美国材料与试验协会(American Society for Testing and Materials ...
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...
在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23 作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...
- 微服务开发中的数据架构设计 1
GitChat 作者:陈伟荣 原文:微服务开发中的数据架构设计 关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术 [不要错过文末彩蛋] 前言 微服务是当前非常流行的技术框架,通过服务的小 ...
- iOS 中 XML 数据交换格式
XML 是一种自描述的数据交换格式,但是 XML 的数据交换格式并没有 JSON 来的轻便,但是无可否认的是,XML 的应用范围也是非常广泛的,比如在 ROS(一个开源机器人操作系统)中利用 ...
最新文章
- 微软发布虚机管理SCVMM 2008 R2 RC版
- ECSHOP 助手使用
- 151. 翻转字符串里的单词
- Python 技术篇-使用opencv库读取中文路径图片报错解决办法
- python结巴分词 词频统计_一个txt文档,已经用结巴分词分完词,怎么用python工具对这个分完词的文档进行计算统计词频,求脚本,非...
- Spring学习总结一
- make: 警告:检测到时钟错误。您的创建可能是不完整的。
- Web前端笔记-画布拖动及放缩(two.js)
- 迷你版Spring MVC 实现
- 计算机会计系统审计的内容包括什么,会计电算化系统审计.docx
- spark-env.sh配置
- 国人不能再过度迷信开源软件
- C#控件储备——信息提示控件toolTip
- bat计算机清理原理,电脑如何一键清除垃圾bat
- java五险一金去从工资扣吗,五险一金需要自己交钱吗?是从工资里扣除还是......
- sspanel v3 配置的完整教程(转)
- Oracle 12c RAC 安装文档
- Tomcat核心原理学习总结(二)
- 我们应该如何看待马斯克心心念念的“超循环”技术
- miix4linux双系统,情理之中,意料之外:Lenovo 联想 MIIX4 平板电脑 低配版
热门文章
- 神经进化学的简介和一个简单的CPPN(Compositional Pattern Producing Networks)DEMO
- Sql Server REPLACE函数的使用
- Android学习笔记(八)
- VS2008找不到MFC90d.dll错误解决方法
- 先写一点informix的
- 解决eclipse出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
- Kafka集群安装Version2.10
- Spring之数据源整理
- 跨路由器 网段访问rtsp_实验演示:三层交换机与路由器对接
- matlab两个图共用一个x轴_Matlab Figures (3) —— 叠加作图与多坐标轴