AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

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

  • 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:388541

评论

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

第九周作业

熊桂平

极客大学架构师训练营

第九周作业

文智

极客大学架构师训练营

Week_09 作业

golangboy

极客大学架构师训练营

田哥:面试被问== 与equals 的区别,该怎么回答?

田维常

面试

第九周作业

【薪火计划】04 - 心态和角色

码字与律动

管理

第9周学习总结

饭桶

记一次HEX和RGB互换算法的思考及应用

徐小夕

Java 面试 算法 大前端

智能灯串开发资料全开源!为这个冬天装点烂漫“星空”

智能物联实验室

人工智能 物联网 智能硬件 智能家居

week5-(2选1)

未来已来

week5-根据当周学习情况,完成一篇学习总结

未来已来

还在用分库分表?看TiDB如何解决海量数据无感扩容难题

京东科技开发者

数据库 分布式数据库 #TiDB

讲武德,你们要的高性能日志工具 Log4j2,来了

沉默王二

Java log4j

5G革命:如何让「数据」实现最大性能?

VoltDB

数据库 数据分析 5G 工业互联网

《Elasticsearch服务器开发》.pdf

田维常

elasticsearch

第五周作业

jizhi7

Week_09 总结

golangboy

极客大学架构师训练营

Istio 中的智能 DNS 代理功能

Jimmy Song

开源 云原生 Service Mesh istio 服务网格

鹿鼎记 · 韦小宝,丽春院、天地会、入皇宫等五个场景的恶搞版多线程锁学习!

小傅哥

Java 程序员 小傅哥 多线程

【架构师训练营 1 期】第九周学习总结

诺乐

第九周总结

熊桂平

经典计算机课程

Joseph295

【架构师训练营 1 期】第九周作业

诺乐

为什么你写的拦截器注入不了 Java bean?

Java旅途

Java spring Spring Boot 拦截器

vivo 调用链 Agent 原理及实践

vivo互联网技术

Java 架构 调用链

展现非凡领跑力,京东会展云斩获“十大云原生行业落地典范”奖项

京东科技开发者

云计算 AI 云原生

第九周总结

脚手架 | 从零搭建满足权限校验等需求的前端命令行工具

梁龙先森

node.js 大前端

Week 9 作业02

Croesus

极客大学 - 架构师训练营 第十周作业

9527

第九周课后练习

饭桶

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