zoukankan      html  css  js  c++  java
  • 跨语言通信方案的比较—Thrift、Protobuf和Avro

    Thrift由Facebook开源的一个RPC框架,用来进行可扩展且跨语言的服务的开发,使得各种编程语言间无缝结合的、高效的服务。我们依据Thrift的规范 简单定义访问接口,通过Thrift编译器编译生成各种编程语言代码,实现各种语言模块之间的高效互访问,速度比Google的Protocol Buffers还要快。Thrift可以说它是现在最优秀的分布式通信机制,实现了在大型分布式集群中各独立模块之间的高效协同。

    Protocol Buffer 是一种序列化与结构化数据的一种机制,具有跨平台、解析速度快、序列化数据体积小、扩展性高、使用简单的特点。

    Apache Avro 是一个二进制的数据序列化系统。实际上 Avro 除了序列化之外,像 MP 一样也提供了远程调用( RPC )功能。 Avro 是属于 Hadoop 的一个子项目,由 Hadoop 的 创始人 Doug Cutting 牵头开发,设计用于支持大批量数据交换的应用,依赖模式 (Schema) 来实现数据结构定义,模式由 JSON 对象来表示, Avro 也被作为一种 RPC 框架来使用。客户端希望同服务器端交互时,就需要交换双方通信的协议,它类似于模式,需要双方来定义,在 Avro 中被称为消息 (Message) 。通信双方都必须保持这种协议,以便于解析从对方发送过来的数据,这也就是传说中的握手阶段。

    Google protobuf:

    优点

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

    缺点

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

    Apache Thrift:

    应用

    优点

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

    缺点

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

    Apache Avro:

    应用

    优点

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

    缺点

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

     

  • 相关阅读:
    jdk和jre是什么?都有什么用?(转帖)
    滚动栏范围位置函数(SetScrollRange、SetScrollPos、GetScrollRange、GetScrollPos)
    C#异步调用
    编译hadoop2.2.0源码时报错
    项目中登陆页面的显示
    VB读写Excel
    C socket demo
    java设计模式----单例模式
    poj3358数论(欧拉定理)
    Java实现 蓝桥杯VIP 算法训练 排列问题
  • 原文地址:https://www.cnblogs.com/kaleidoscope/p/10033328.html
Copyright © 2011-2022 走看看