Thrift 是由 Facebook(现 Meta)开发并开源的一套高性能、语言无关的 RPC(远程过程调用)框架,它定义了一套简单、可扩展的数据类型和服务接口定义语言(IDL, Interface Definition Language),并据此生成多种主流编程语言的代码,从而实现不同服务之间的跨语言、高效通信。

使用thrift互联网公司
(图片来源网络,侵删)

在互联网公司中,Thrift 曾扮演过极其重要的角色,是构建大型分布式系统的基石之一,虽然现在面临着 gRPC 等新技术的挑战,但许多大型公司仍在使用和维护基于 Thrift 的庞大系统。


为什么互联网公司选择 Thrift?(核心优势)

互联网公司业务复杂,系统架构庞大,服务数量繁多,因此对服务间的通信技术有很高的要求,Thrift 凭借其以下核心优势,成为许多公司的首选:

多语言支持

这是 Thrift 最核心的优势之一,在一个典型的互联网公司后端,你可能需要用 C++ 编写高性能的核心服务,用 Java/Scala 编写业务逻辑,用 Python 进行数据分析或写脚本,用 Go 或 Rust 开发新的微服务,Thrift 可以轻松地将这些不同语言的服务连接起来,无需关心底层网络通信的细节。

高性能

Thrift 的性能是其另一大杀手锏,它通过以下方式实现高性能:

使用thrift互联网公司
(图片来源网络,侵删)
  • 二进制协议:Thrift 默认使用二进制协议进行数据序列化,相比 JSON、XML 等文本协议,它体积更小、解析速度更快,极大地减少了网络传输开销和 CPU 消耗。
  • 高效的代码生成:根据 IDL 生成的代码是高度优化的,直接操作内存,避免了动态解释的开销。
  • 多种传输层:支持阻塞式、非阻塞式(NIO)等多种传输方式,可以很好地集成到高性能网络框架(如 Netty)中。

可扩展性与灵活性

Thrift 的设计非常灵活,提供了多种组件供你选择和组合:

  • 数据类型:支持基本数据类型、结构体、列表、集合、Map 等,可以灵活地定义复杂的数据结构。
  • 协议:除了高效的二进制协议,还支持 JSON、XML、Compact 等多种协议,方便调试或与不同系统交互。
  • 传输层:支持内存 I/O(用于单元测试)、Socket、HTTP 等多种传输方式。
  • 服务器模型:支持单线程、多线程、非阻塞等多种服务器模型,以适应不同的并发场景。

清晰的接口定义

Thrift 使用 IDL 来定义服务接口,这种“契约优先”(Contract-First)的方式带来了很多好处:

  • 明确契约:服务提供方和消费方必须就接口达成一致,接口定义就是唯一的“真理”。
  • 减少沟通成本:新加入的开发者可以通过阅读 IDL 文件快速理解服务的功能和数据结构。
  • 代码生成自动化:只需维护一份 .thrift 文件,即可为所有相关语言生成客户端和服务端代码,极大地提高了开发效率和降低了出错率。

Thrift 在互联网公司中的典型应用场景

基于以上优势,Thrift 在互联网公司的架构中无处不在。

构建微服务架构

这是 Thrift 最经典的应用场景,在微服务架构中,一个庞大的应用被拆分成多个小而独立的服务,这些服务之间需要频繁地互相调用,Thrift 作为服务间的通信总线,负责将一个服务的“方法调用”透明地转化为网络请求,传递到另一个服务并返回结果。

使用thrift互联网公司
(图片来源网络,侵删)
  • 示例:电商系统中,有订单服务、用户服务、商品服务、库存服务等,订单服务在创建订单时,需要调用用户服务获取用户地址,调用商品服务获取商品详情,调用库存服务扣减库存,这些调用都可以通过 Thrift RPC 完成。

跨语言系统集成

许多互联网公司是技术多元化的,内部存在大量不同语言开发的服务,Thift 是连接这些“技术孤岛”的最佳桥梁。

  • 示例
    • 一个核心的广告推荐引擎(用 C++ 编写,追求极致性能)需要将推荐结果推送给一个Web 后端服务(用 Java 编写),两者通过 Thrift 通信,Java 端调用 C++ 端的推荐接口。
    • 一个数据平台(用 Python/Spark 编写)需要调用实时计算服务(用 Scala 编写)获取数据流,两者也通过 Thrift 交互。

内部 API 网关与中间件

一些公司会构建一个内部的 API 网关或中间件,所有外部或内部的请求都通过它进行路由、认证、限流等,这个网关本身可能就是一个高性能的 Thrift 服务器,它接收前端的请求,然后根据规则调用后端的各个 Thrift 微服务。

数据传输与序列化

即使不用于 RPC,Thrift 也可以作为一种高效的数据序列化工具,将结构化数据(如日志、配置、缓存数据)序列化成二进制格式进行存储或传输,其效率和空间占用都优于 JSON。


大型公司的实践案例

  • Meta (Facebook):Thrift 的诞生地,Meta 内部有海量的服务,几乎所有的跨语言服务通信都依赖 Thrift,它支撑着全球最大的社交网络,其稳定性和性能经过了极致的考验。
  • Evernote:曾是 Thrift 的忠实用户,用它来连接其客户端(多种平台)和后端服务。
  • 阿里巴巴:虽然现在主推 Dubbo,但在早期,内部也曾广泛使用 Thrift,很多遗留系统仍在使用。
  • 百度、腾讯:这些巨头的技术栈非常复杂,内部都有大量的基于 Thrift 构建的系统和中间件,用于连接不同部门、不同团队开发的服务。

Thrift vs. gRPC:现代互联网公司的选择

当要为新项目选择 RPC 框架时,互联网公司更多地会在 ThriftgRPC 之间进行权衡。

特性 Thrift gRPC
开发公司 Meta (Facebook) Google
协议 可选(二进制、JSON等) 默认使用 HTTP/2 + Protocol Buffers
多语言支持 非常广泛(C++, Java, Python, Go, Ruby, PHP等) 广泛(主流语言支持良好,但略少于Thrift)
性能 极高(二进制协议,代码优化好) 极高(HTTP/2多路复用,Protobuf序列化高效)
Web集成 较弱(可通过HTTP传输) 原生支持(基于HTTP/2,天然适合Web和移动端)
生态与工具链 成熟稳定,但生态相对较老 非常活跃,与Kubernetes、Service Mesh等云原生技术结合紧密
标准与社区 Apache 软件基金会项目,社区活跃 CNCF (云原生计算基金会) 项目,社区非常活跃
主要优势 语言支持无死角,历史遗留系统多 基于HTTP/2,对Web友好,生态现代化,流式支持更好

现代互联网公司的选择趋势:

  • 新项目/云原生项目gRPC 正在成为首选,因为它基于现代的 HTTP/2 协议,对网络环境更友好(尤其是在公网或复杂的云环境中),并且与 Kubernetes、Istio 等云原生生态无缝集成。
  • 遗留系统/特定场景Thrift 依然坚挺,许多公司有庞大的基于 Thrift 的历史系统,维护成本高,因此会继续使用,如果项目对某些“小众”语言(如 PHP, Ruby)有强依赖,而 gRPC 支持不佳,Thrift 仍然是更好的选择。

Thrift 是互联网公司发展史上一个里程碑式的 RPC 框架,它以其卓越的性能、无与伦比的多语言支持和灵活性,在大型分布式系统和微服务架构的构建中发挥了不可替代的作用,至今仍是许多公司技术栈的基石。

虽然面对 gRPC 的强劲挑战,其在新项目中的热度有所下降,但其在海量服务、复杂语言环境下的稳定性和成熟度,确保了它将在很长一段时间内继续服务于全球互联网的“后台”,对于开发者而言,理解 Thrift 的工作原理和设计思想,对于维护现有系统或进行技术选型都具有重要意义。