手记

和 Thrift 的一场美丽邂逅

一. 与 Thrift 的初识

也许大多数人接触 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(远程过程调用)。

先看下面这个栗子:

publicvoidinvoke(){

    String param1 = "my String 1";

    String param2 = "my String 2";

    String res = getStr(param1, param2);

    System.out.println("res="+ res)

}

privateString getStr(String str1, String str2){

    returnstr1 + str2;

}

这是一个最简单不过的本地函数调用代码,调用方和被调用方都在一个程序内部,属于进程内调用。

CPU 在执行调用时切换去执行被调用函数,执行完后再切换回来执行后续的代码。对调用方而言,执行被调用函数时会阻塞(非异步情况下)直到调用函数执行完毕。过程如图 2.1

图 2.1


接下来看个 RPC 调用的栗子:

publicvoidtest(){

    TestQry.Client client = getClient("192.168.4.222", 7800, 5000);

    String param1 = "my String 1";

    String param2 = "my String 2";

    String res = client.getStr(param1, param2);

    System.out.println("res="+ res);

}

privateTestQry.Client getClient(String ip, intport, inttimeOut) throwsException{

    TSocket tSocket = newTSocket();

    TTransport transport = newTFramedTransport(tSocket);

    tTransport.open();

    TProtocol protocol = newTBinaryProtocol(tTransport);

    returnnewTestQry.Client(protocol);

}

这是一个进程间调用,调用方和被调用方不在同一个进程(甚至不同的服务器或机房)。

进程间调用需要通过网络来传输数据,调用方在执行 RPC 调用时会阻塞(非异步情况下)直到调用结果返回才继续执行后续代码。过程如图 2.2

图 2.2


一言以蔽之,RPC 是一种通过网络从远程计算机程序上请求服务的方式,它使得开发包括网络分布式多程序在内的应用程序更加容易。

三. 不仅仅是个序列化工具

Thrift最初是由 Facebook 开发用做系统内各语言之间的



作者:java菜
链接:https://www.jianshu.com/p/da6cfa17f9e7


0人推荐
随时随地看视频
慕课网APP