当前位置: 首页 > news >正文

【转载】跨语言通信方案比较

2019独角兽企业重金招聘Python工程师标准>>> hot3.png


常用的跨语言通信方案:

  • 基于 SOAP 消息格式的 WebService ;
  • 基于 JSON 消息格式的 RESTful 服务;

以上两种方案的弊端:

  • XML 体积太大,解析性能极差;
  • JSON 体积相对较小,解析相对较快,但表达能力较弱;

于是探索一下现在比较流行的跨语言通信方案:

  • Google protobuf
  • Apache Thrift
  • Apache Avro

Google protobuf

Protocol Buffers 是 Google 公司开发的一种数据描述语言;
可用于数据存储、通信协议等方面,它不依赖于语言和平台,并且可扩展性极强;
现阶段官方支持 C++、JAVA、Python 等三种编程语言,但可以找到大量的、几乎涵盖所有语言的第三方扩展包;
消息格式定义采用 proto 文件;

应用

  • Google 内部

优点

  • 二进制消息,性能好、效率高(空间和时间效率都很不错);
  • 基于 proto 文件生成目标代码,简单易用;
  • 序列化/反序列化直接对应程序中的数据类,不需要解析后再进行映射(XML 与 JSON 也都属于这种方式);
  • 支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),简化升级;
  • 支持多种语言(可以把 proto 文件看做 IDL 文件);
  • 与 Netty 等一些框架集成;

缺点

  • 官方只支持 C++, JAVA 和 Python 语言绑定;
  • 二进制可读性差(貌似提供了 Text_Fromat 功能);
  • 二进制不具有自描述特性;
  • 默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)
  • 只涉及序列化和反序列化技术,不涉及 RPC 功能(类似 XML 或者 JSON 的解析器)

Apache Thrift

Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架;
现在已经转到 Apache 组织下,提供数据序列化功能和 RPC 服务能力;
支持 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等语言;
消息格式定义采用 thrift 文件;

应用

  • Facebook 的开源的日志收集系统 scribe
  • 淘宝的实时数据传输平台 TimeTunnel ;
  • Evernote 开放接口
  • Quora ;
  • HBase

优点

  • 支持非常多的语言绑定;
  • thrift 文件生成目标代码,简单易用;
  • 消息定义文件支持注释
  • 数据结构与传输表现的分离,支持多种消息格式;
  • 包含完整的客户端/服务端堆栈,可快速实现 RPC
  • 支持同步和异步通信

缺点

  • 和 protobuf 一样不支持动态特性;

Apache Avro

Avro 出自 Hadoop 之父 Doug Cutting ;
目标是推出标准性的、用于云计算的、数据交换和存储协议;
支持 C, C++, Java, Python, Ruby, PHP 等语言;
消息格式定义采用 JSON 描述;

应用

  • Hadoop RPC

优点

  • 二进制消息,性能好/效率高;
  • 使用 JSON 描述模式;
  • 模式和数据统一存储,消息自描述,不需要生成 stub 代码(支持生成 IDL);
  • RPC 调用在握手阶段交换模式定义;
  • 包含完整的客户端/服务端堆栈,可快速实现 RPC;
  • 支持同步和异步通信;
  • 支持动态消息;
  • 模式定义允许定义数据的排序(序列化时会遵循这个顺序);
  • 提供了基于 Jetty 内核的服务基于 Netty 的服务;

缺点

  • 只支持 Avro 自己的序列化格式;
  • 语言绑定不如 Thrift 丰富;



转载于:https://my.oschina.net/moooofly/blog/300385

相关文章:

  • 【WP 8.1开发】自定义(RAW)通知的使用
  • java 递归函数
  • jQuery Validation Engine 表单验证
  • GLES Shader Language 易错集锦
  • python的getopt
  • mac下mysql忘记root密码
  • 编程语言,变量
  • 关于git和github用法
  • Python学习(一)——数据类型
  • 定制微型Linux系统(续)
  • Redis进阶 ----事务
  • 【Spark亚太研究院-构建Spark集群-配置Hadoop伪分布模式并运行Wordcount(2)
  • 《设计模式系列》---组合模式
  • Exchange 2013sp1邮件系统部署-(九)
  • 点与不规则图形关系判断
  • cookie和session
  • django开发-定时任务的使用
  • ES6简单总结(搭配简单的讲解和小案例)
  • JavaScript实现分页效果
  • js正则,这点儿就够用了
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Mysql数据库的条件查询语句
  • MySQL主从复制读写分离及奇怪的问题
  • sublime配置文件
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 闭包--闭包作用之保存(一)
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微信小程序设置上一页数据
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 怎么将电脑中的声音录制成WAV格式
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $L^p$ 调和函数恒为零
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2)MFC+openGL单文档框架glFrame
  • (C#)获取字符编码的类
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转) Face-Resources
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 设计一套高性能的弱事件机制
  • .NET建议使用的大小写命名原则
  • .Net语言中的StringBuilder:入门到精通
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [android] 天气app布局练习
  • [AX]AX2012 SSRS报表Drill through action