也许大多数人接触 Thrift 是从序列化开始的。每次搜索 “java序列化” + “方式”、“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化方式的使用方法或者性能对比的结果给你,而其中必定少不了 Thrift,并且其性能还不错嘞,至少比那战斗力只有1的渣渣 java 原生序列化要强很多(好吧原谅我的小情绪……)。

然而,我最初接触 Thrift 却是从公司的一个项目开始。

也就在去年的这个时候,我所在事业部发现几个 UGC 社区的小广告特别严重,Boss 要求所有社区必须接入公司的富媒体监控系统(负责公司所有业务的内容审核、处罚工作,以下简称监控系统),以实现 UGC 内容(包括文本、图片、音视频以及用户头像、昵称等UserInfo)的准实时上报与垃圾信息的自动处理(如清理现场、账号封禁等)。出于对业务服务的最小侵入、功能复用和流程统一等原则的考虑,抽象出介于业务系统和监控系统之间的接入系统,统一负责对数据的接收、上报、重推、搜索、结果查询以及对监控系统处罚指令的转发。该业务可简单抽象成图 1.1:

图 1.1

由于监控系统使用 Thrift 提供服务,因此接入系统与监控系统之间的交互都使用 Thrift 协议。考虑到接入的便捷性,业务系统可以使用 Thrift 和 Http 两种协议与接入系统交互。

当时是我一个人负责这个项目,由于对 Thrift 的认识还是0,且项目时间短,所以总体上项目是非常赶的,一开始以为自己难以在规定时间内完成,但想不到 Thrift 开发起来还真的是相当的便捷。系统按时上线了,至今也没出什么幺蛾子。后来又通过学习进一步了解了 Thrift,深以为是个必须入手的技能。

好吧,至此算是和 Thrift 正式结缘了。

二. 所谓的 RPC

在了解 Thrift 之前,先来简单科普一下什么是 RPC(远程过程调用)。

先看下面这个栗子: