在很多地方都有“数据交换”这个概念,本文所说的“数据交换” 是指在计算机网络中,一个系统把数据传递给另外一个系统。这非常类似于一个人要告诉另外一个人一件事情。
当一个人要把一件事情告诉另外一个人的时候,我们可以通过电话、邮件、短信、IM工具或者当面说的方式来交流。这种方式类似于系统数据交换要通过 tcp、udp、管道等等的方式实现。当两个人交流的时候,我们需要一种共同的语言才能明白对方的意思,同样的,两个系统要交换数据,也需要定义一种双方都明白的协议,我们称为“数据交换协议”。
数据交换协议
数据交换协议的目的是让两个系统进行正确的数据交互。所以几乎各种开发语言都提供了方便使用的数据交换功能。比如说使用JAVA语言的开发的系统使用 MySQL数据库存储数据,就是通过MySQL数据交换协议跟MySQL做数据交换;通过JAVA的RMI可以方便的做跨机器的分布式数据交换,RMI也就是一种数据交换协议。
一般我们在不同的系统、不同的语言之间交换数据的时候,我们会选择一种通用的交换协议或者自己定义一种容易使用的交换协议。 WebService曾经非常流行, 在Web 2.0时代,轻量级的REST协议又开始受到追捧。那么究竟在我们的系统中应该选择什么样的协议呢?
如何选择数据交换协议
选择什么样的协议跟我们的应用场景有很大的关系。我们需要考虑我们开发是否方便、接口是否容易发布、是否需要考虑带宽占用成本、序列化和反序列化的性能、接口协议的扩展性等等。下面我们看下几个比较常用的交换协议实现。
上面表格列出了一些常用数据交换协议的一些特性的比较。这里并没有比较好坏,只是想说明不同数据交换协议是有区别的,所以我们需要在我们的应用场景中进行选择。
开放式
像微博,SNS这种开放平台、对静态html页面提供javascript接口调用的系统都属于这种类型 。这种类型的特点是:
调用方不完全可控,而且是针对公网的,你可能不知道是谁、是什么语言、是什么方式在调用你提供的数据接口;
接口访问量一般都非常大,要求具有很高的性能和吞吐量;
需要考虑安全问题,外部提交的数据可能不是合法的。
所以在这种情况下,需要考虑数据传输的带宽消耗和数据交换协议的易用性,以及多语言支持程度。以前对于html页面使用的javascript接口调用一般都使用XML格式,最近几年几乎都转成了json格式了,因为json传输量更小,比XML更加容易使用。 而对于开放平台,由于使用的场景很多,所以需要提供多种交换协议格式。基本上都会提供XML和json。为了提高平台本身的性能和客户端的性能,也可以提供protobuf这种二进制交换协议并且增加压缩支持,以节省带宽传输和解析的性能消耗。
内部服务
对于一个大型系统来说,内部服务的数据交换无处不在。从最基本和常见的数据库数据交换、memcached缓存数据交换、消息队列的数据交换到系统之间使用的RPC服务框架等等,都可以算作内部服务的数据交换。内部服务的特点是不用考虑防火墙,不对外开放,速度快(基本无带宽成本)。
内部服务的数据交换协议的选择空间非常大,一般需要考虑:
数据交换协议的性能
是否需要跨语言支持
数据交换协议的消息体大小
持久化存储
对于持久化存储来说,每一种数据交换协议其实都可以实现。一般需要根据应用场景考虑:
是否人工可阅读
存储的空间消耗
序列化和反序列化的性能
是否经过压缩
跨语言
假设我们的网站前端页面展示层使用PHP语言开发,中间业务逻辑使用JAVA语言开发,那么就涉及到跨语言数据交换的问题。只要系统不是单纯的使用一种语言,那么就必须考虑这个问题。事实上,考虑未来的扩展和需求变化问题,也最好考虑跨语言的数据交互协议。
数据交换协议可升级
在选择数据交换协议的时候,我们同样需要考虑类似于数据库表的?schema设计时的扩展问题。比如一个提供用户信息的数据交换协议接口,现在包含用户名、性别、住址的信息,在升级过程中,增加了一个最后登录的IP信息。如果不考虑数据交换协议升级带来的影响,很可能会导致以前的客户端出现异常或者旧的数据无法正确解析的问题。
兼容协议的巧用
兼容协议的巧用非常有用,新产品兼容提供现有成熟的数据交换协议,可以降低使用门槛和产品的开发速度。比如新浪开源的memcacheQ就使用了memcached协议。
总结
数据交换协议的各种通用开源实现非常多,数据交换协议只是一个非常宽泛的说法,其实只要实现了数据的序列化和反序列化 ,那么就可以说是一个可以交换数据的协议。数据交换协议的性能其实就是序列化和反序列化的性能,如果加上RPC,那么跟RPC实现本身的性能也有非常大的关系。
参考链接:
java序列化和反序列化性能比较:
https://github.com/eishay/jvm-serializers/wiki
[之后会有详细的一些传输协议的性能比较的文章 基于jvm-serializers测试]
Java跨语言调用实现方案
http://rdc.taobao.com/team/jm/archives/389
文章转自
http://www.cnblogs.com/sunli/archive/2011/05/12/data-exchange-protocol.html
- 大小: 12.5 KB
分享到:
相关推荐
外部接口则涵盖了系统与其他系统、设备或服务的连接方式,例如数据交换格式、通信协议等。 4. 数据库设计 虽然在概要设计中,数据库设计可能不会像详细设计那样深入,但通常会涉及到数据模型的选择、主要数据表的...
PDO用于设备间实时数据交换,SDO则用于非实时参数配置。 4. **实时性保证**:EtherCAT的性能依赖于严格的实时性,因此需要优化代码以满足最小响应时间要求,例如采用中断驱动的通信方式。 5. **错误检测与恢复**:...
■ 本平台的设计初衷其实是为方便我和妻子日常交流,大型企业里一般都限制即时通讯软件的使用,于是我运用所学开发了具备一定隐蔽性和系统热键功能的私人聊天工具,加上通用型的HTTP协议和XML节点内的密码验证,...
通过SPI接口,STM32可以控制闪存读写操作,从而实现数据交换。 在固件开发中,我们需要编写USB设备驱动程序,实现USB堆栈,包括设备枚举、设置处理、中断处理等。STM32CubeMX是一个强大的配置和代码生成工具,可以...
1. **通信协议**:无人机与服务器之间的数据交换需要遵循特定的通信协议,如MQTT、TCP/IP或者自定义的串行通信协议,以确保数据的可靠传输。 2. **数据封装和解封装**:飞控系统发送的数据需要被封装成适合网络传输...
作者金步国是一位自由软件爱好者,遵循GPL协议发布本文档,鼓励大家自由使用、转载和分发,但需保留原文档的完整性和作者信息。 #### 二、代码成熟度选项(Code Maturity Level Options) 这部分选项主要涉及内核中...
串口通信编程是一种在计算机和外部设备之间进行数据交换的技术,尤其在嵌入式系统、工业控制、仪器仪表等领域广泛应用。"串口通信编程大全COM"这个资源可能包含全面的串口通信编程技术和实例,旨在帮助开发者深入...
4. **Data Transfer Object Factory**:利用DTO(Data Transfer Object)Factory简化了Entity Bean的数据传输过程,提高了数据交换的效率。 5. **Generic Attribute Access**:通过Attribute Access接口简化Entity ...
同时,还讲解了XML数据处理,这在处理配置文件或交换数据时非常有用。 教程还涉及了Qt的网络编程部分,包括HTTP编程、FTP协议、获取本机网络信息、UDP和TCP通信等。对于初学者而言,这些都是理解网络通信不可或缺的...
Web服务(Web Service)是一种基于互联网的、采用标准XML(Extensible Markup Language)进行通信的...通过研究这个示例,你可以更好地掌握如何创建、部署和调用Web服务,以及如何在不同的系统和应用之间实现数据交换。
这种设计对于处理大规模并发连接的场景尤其有用,例如在线游戏服务器、实时聊天应用或者大规模数据交换服务。 在可扩展性方面,EMTASS可能提供了灵活的模块化设计,使得开发者可以根据实际需求动态添加或调整服务器...
在描述中虽然没有提供具体的技术细节,但提到了原创性和版权保护,暗示了这些源代码可能是作者个人或团队独立开发的,并且对未经许可的转载进行了警告。这表明源代码可能包含了一些独特的设计或算法,因此理解并使用...
串口通信是嵌入式系统中常用的通信方式,用于与外部设备进行数据交换。 手册还特别说明了模块的一些特殊功能,如节能功能和飞行模式。节能功能可以延长模块在电池供电条件下的使用时间,包括睡眠模式等多种省电模式...