在不少地方都有"数据交换"这个概念,本文所说的"数据交换" 是指在计算机网络中,一个系统把数据传递给另一个系统。这很是相似于一我的要告诉另一我的一件事情。javascript
当一我的要把一件事情告诉另一我的的时候,咱们能够经过电话、邮件、短信、IM工具或者当面说的方式来交流。这种方式相似于系统数据交换要经过 tcp、udp、管道等等的方式实现。当两我的交流的时候,咱们须要一种共同的语言才能明白对方的意思,一样的,两个系统要交换数据,也须要定义一种双方都明白的协议,咱们称为"数据交换协议"。php
数据交换协议的目的是让两个系统进行正确的数据交互。因此几乎各类开发语言都提供了方便使用的数据交换功能。好比说使用JAVA语言的开发的系统使用 MySQL数据库存储数据,就是经过MySQL数据交换协议跟MySQL作数据交换;经过JAVA的RMI能够方便的作跨机器的分布式数据交换,RMI也就是一种数据交换协议。html
通常咱们在不一样的系统、不一样的语言之间交换数据的时候,咱们会选择一种通用的交换协议或者本身定义一种容易使用的交换协议。 WebService曾经很是流行, 在Web 2.0时代,轻量级的REST协议又开始受到追捧。那么究竟在咱们的系统中应该选择什么样的协议呢?前端
选择什么样的协议跟咱们的应用场景有很大的关系。咱们须要考虑咱们开发是否方便、接口是否容易发布、是否须要考虑带宽占用成本、序列化和反序列化的性能、接口协议的扩展性等等。下面咱们看下几个比较经常使用的交换协议实现。java
协议 | 实现 | 跨语言 | 性能 | 传输量 | 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 |
上面表格列出了一些经常使用数据交换协议的一些特性的比较。这里并无比较好坏,只是想说明不一样数据交换协议是有区别的,因此咱们须要在咱们的应用场景中进行选择。git
像微博,SNS这种开放平台、对静态html页面提供javascript接口调用的系统都属于这种类型 。这种类型的特色是:github
因此在这种状况下,须要考虑数据传输的带宽消耗和数据交换协议的易用性,以及多语言支持程度。之前对于html页面使用的javascript接口调用通常都使用XML格式,最近几年几乎都转成了json格式了,由于json传输量更小,比XML更加容易使用。 而对于开放平台,因为使用的场景不少,因此须要提供多种交换协议格式。基本上都会提供XML和json。为了提升平台自己的性能和客户端的性能,也能够提供protobuf这种二进制交换协议而且增长压缩支持,以节省带宽传输和解析的性能消耗。数据库
对于一个大型系统来讲,内部服务的数据交换无处不在。从最基本和常见的数据库数据交换、memcached缓存数据交换、消息队列的数据交换到系统之间使用的RPC服务框架等等,均可以算做内部服务的数据交换。内部服务的特色是不用考虑防火墙,不对外开放,速度快(基本无带宽成本)。apache
内部服务的数据交换协议的选择空间很是大,通常须要考虑:json
对于持久化存储来讲,每一种数据交换协议其实均可以实现。通常须要根据应用场景考虑:
假设咱们的网站前端页面展现层使用PHP语言开发,中间业务逻辑使用JAVA语言开发,那么就涉及到跨语言数据交换的问题。只要系统不是单纯的使用一种语言,那么就必须考虑这个问题。事实上,考虑将来的扩展和需求变化问题,也最好考虑跨语言的数据交互协议。
在选择数据交换协议的时候,咱们一样须要考虑相似于数据库表的?schema设计时的扩展问题。好比一个提供用户信息的数据交换协议接口,如今包含用户名、性别、住址的信息,在升级过程当中,增长了一个最后登陆的IP信息。若是不考虑数据交换协议升级带来的影响,极可能会致使之前的客户端出现异常或者旧的数据没法正确解析的问题。
兼容协议的巧用很是有用,新产品兼容提供现有成熟的数据交换协议,能够下降使用门槛和产品的开发速度。好比新浪开源的memcacheQ就使用了memcached协议。
数据交换协议的各类通用开源实现很是多,数据交换协议只是一个很是宽泛的说法,其实只要实现了数据的序列化和反序列化 ,那么就能够说是一个能够交换数据的协议。数据交换协议的性能其实就是序列化和反序列化的性能,若是加上RPC,那么跟RPC实现自己的性能也有很是大的关系。
个人新浪微博@sunli1223 ,欢迎与我讨论。
参考连接: