Thrift三篇

2024-09-12

Thrift 篇1

随着计算机系统规模变得越来越大,将所有业务单元集中部署在一个或若干个高性能主机(如大型机、小型机等)上的体系结构已经难以满足当今计算机系统,尤其是随着大型互联网系统的快速发展,分布式处理方式越来越受到业界青睐。计算机系统正在经历一场前所未有的从集中式向分布式架构的变革。在分布式架构的计算机系统中,各业务单元之间通过远程过程调用(RPC)的方式相互交换数据,以实现业务单元之间的互操作。因此,提高RPC的性能成为提高系统性能的关键。缓存机制对于提高RPC的性能具有非常大的帮助,通过将已处理得到的结果进行缓存,可以避免重复执行耗时的处理过程,提高RPC响应速度,同时降低服务端因为重复处理导致的资源消耗,使RPC的整体性能得到提升。

Thrift是一种高效的开源RPC开发框架,因为其具有多语言支持、高效、简单和易于扩展的特点,被广泛应用于各种分布式计算机系统中。但当前Thrift中还没有对缓存机制的支持,为了提高Thrift的访问性能,在Thrift中增加缓存机制是非常有必要的。Redis是一种高性能的基于Key-Value模型的内存数据库,被许多分布式系统用作数据缓存。本文主要介绍了将Redis作为数据缓存与Thrift结合,设计并实现基于Redis的Thrift缓存机制,可有效提高Thrift的RPC性能。

1 Thrift简介

Thrift是一个跨语言的RPC开发框架,最初由Face-book于2007年开发,并于2008年进入Apache开源项目。Thrift通过一个中间语言IDL来定义RPC的接口以及用到的数据类型,然后通过Thrift提供的IDL编译器生成不同语言的服务端和客户端框架代码,并由生成的框架代码调用协议层和传输层接口完成RPC过程[1]。Thrift架构如图1所示。

Thrift架构主要由应用层、框架层、协议层和传输层组成[2]:(1)传输层负责实现使用不同传输方式的数据传输。当前Thrift提供TCP、HTTP、SSL、管道、文件等传输方式;(2) 协议层提供多种格式的编码范式,实现对Thrift支持的各种数据类型的编码,以及消息结构的编码,如二进制格式、Json格式、压缩的二进制格式等;(3)框架层是由开发者使用Thrift的IDL对服务及其相关数据结构进行定义后,通过Thrift提供的编译器自动生成的框架代码。框架层使用协议层提供的接口,基于服务的定义实现服务的客户端和服务端接口。框架层还为服务端开发提供了多种类型的服务引擎,包括单线程、多线程、线程池以及非阻塞的服务引擎,以简化服务端开发;(4)应用层是开发者基于框架层提供的框架代码编写的应用逻辑。客户端开发者使用客户端接口实现对服务端的访问逻辑,服务端开发者则基于服务端框架开发相应的服务,并选择合适的服务引擎实现服务的运行。

作为一种RPC开发框架,Thrift具有以下特点:(1)跨语言:Thrift支持多种语言,包括C+ +、Java、Python、C#、PHP、Ruby、JavaScript等主流开发语言[3],可以使基于不同语言开发的Thrift客户端与服务端之间实现无缝交互;(2) 高效:Thrift使用二进制、Json等格式编码,相较于使用XML编码的Web Service,Thrift的数据传输更为高效,处理协议编解码所消耗的资源更少;(3)简单:Thrift使用IDL实现服务的定义及相关数据结构的描述,而IDL中采用C风格的数据结构定义,相较于使用WSDL描述的Web Service,更容易被大多数语言的开发者理解和使用;(4)易于扩展:Thrift采用面向对象的方式实现,有清晰的分层结构,开发者可以很方便的在已有的Thrift代码基础上根据自己的需要扩展功能[4]。

2 Redis简介

Redis是一个基于内存的Key-Value模型的开源远程数据库,于2009年首次发布。Redis采用C语言编写,但提供多种语言的访问接口,包括C++、Java、Python等。Redis采用Key-Value模型,使用Hash表来实现Key与Value间的映射关系,因此可以通过Key值高效地对数据进行检索[5]。当使用Redis作为缓存时,经常会与同样用作高性能数据缓存的软件Memcached进行对比。相比Memcached,Redis在提供与Memcached相近的访问速度的前提下,还具有以下特点[6]:

(1)丰富的数据结构支持。Redis支持字符串(STRING)、列表(LIST)、集合(SET)、哈希表(HASH)以及排序集合(ZSET)等数据类型:字符串(STRING)类型是最基本的类型,与许多编程语言中的String类型类似,用于存储字节序列。一个Key与一个字节序列对应,通过Key对该字节序列进行访问;列表(LIST)类型将Key与一个STRING列表对应,可以使用Key向列表的头部或尾部插入或提取数据;集合(SET)类型将Key与一个STRING集合对应,可以使用Key访问集合中的数据并向集合中插入数据,集合中的数据不重复;哈希表(HASH)类型将Key与一个Hash表对应,可以使用一个SubKey向该Hash表中插入和提取数据;排序集合(ZSET)类型与SET类型类似,但在SET类型基础上为每个插入的记录增加了一个浮点类型的Scope属性,该属性在插入记录时指定,每次插入记录后,集合中的数据按照各记录的Scope属性重新排序。

(2)事务控制。Redis提供简单的事务控制机制,通过MUTIL/EXEC命令将多个Redis操作打包起来作为一个命令来执行,Redis保证来自不同客户端的命令串行执行,即在一个命令未执行结束前不会执行其它客户端命令,从而保证了打包在一起执行的命令不会被其它客户端命令干扰,进而提供了数据操作的隔离性。与传统的关系型数据库不同,Redis不提供回滚机制,打包在一起的命令不会因为其中一个命令的执行失败而受到影响。

(3)数据持久化。Redis通过将内存中的数据写入磁盘实现对数据持久化的支持。Redis提供Snapshotting和Append-Only File两种数据持久化方式:Snapshotting方式通过创建Redis的内存数据快照,并将快照存储到磁盘实现数据持久化;Append-Only File方式在每个Redis命令执行后将其以追加的方式写入一个文件,当Redis出现意外关闭后重启时,通过该文件恢复Redis的内存数据。

(4)支持主从复制。Reids支持多级的主从复制,即一个Master可以拥有多个Slave,而每个Slave下还可以拥有多个Slave。通过主从复制的方式可以实现缓存数据的写入与读取分离。

3 Thrift缓存机制设计与实现

Thrift中实现缓存机制的架构由Thrift客户端、Re-dis数据缓存、Thrift服务端组成,如图2所示。当客户端向服务端发起一次调用时,首先计算调用请求的特征值,并使用特征值在数据缓存中检索已经缓存的与调用请求相对应的请求结果数据。如果在缓存中已经缓存了结果数据,则直接从缓存中提取调用的结果数据,如果在缓存中未缓存相应的调用结果数据,则将调用请求发送至服务端,由服务端进行处理。当处理结束后,服务端将请求的结果数据返回客户端,同时以调用请求的特征值Key将请求结果数据插入缓存中,以使后续访问能够直接从缓存中获取结果数据。服务端还对缓存中的数据进行管理,当服务端的状态发生改变后,由服务端主动将缓存中与状态改变相关的缓存数据置为失效,使客户端能够重新访问服务端以获取更新后的数据。

为了在Thrift中实现上述缓存机制,首先需要确定如何实现对数据的缓存。缓存数据是使用指定服务的指定方法以及对指定参数进行调用的结果数据,因此应该使用服务、方法以及使用的参数特征值作为缓存数据的Key。将对服务名、方法名以及编码后的参数进行组合计算得到的MD5值作为特征值,使用Redis的STRING类型实现数据的缓存,将计算得到的MD5 值作为缓存的Key,并将编码后的调用结果作为缓存的值。缓存只存储正常的返回值,对于调用错误或服务端抛出的异常数据不进行缓存。

其次,作为缓存Key的MD5值需要在客户端进行计算,以便在Redis中检索对应的缓存数据,在服务端也需要使用该MD5值作为Key向数据缓存中插入数据。为避免重复计算,在客户端进行MD5值计算后,将该值跟随服务调用请求发送到服务端,由服务端直接使用该值向数据缓存中插入数据。因为需要在服务调用信息中将调用参数的MD5值传递到服务端,而当前的Thrift协议中并不包括该值,因此需要对Thrift编码协议进行扩展以携带该值。

再次,当服务端的计算环境发生变化时,一般会对通过服务方法计算得到的结果产生影响,因此需要提供手段将服务方法对应的所有已缓存的结果数据设置为无效。为实现快速在缓存中查找指定服务方法的已缓存数据,将已缓存数据的Key也进行缓存。通过使用Redis的SET类型将缓存的Key按照其所属的服务方法组织在一起,形成“服务方法-特征值”映射表。该映射表以“服务名-方法名”作为Key,在缓存中插入缓存数据的同时,向缓存中以该数据对应的“服务名-方法名”作为Key,向对应的SET中插入该数据的Key值。当需要将指定服务的指定方法中的所有缓存数据设置为无效时,使用“服务名-方法名”从缓存中对应的SET中提取所有值,并将每个值作为Key在缓存中对应的数据设置为无效。

当服务端以集群的方式部署时,当一个服务端使缓存数据失效时,其它服务端可能同时向缓存中插入数据。在这种情况下,多个服务端同时对Cache进行操作的竞争导致“服务方法-特征值”映射表中的数据丢失,后续无法使该缓存数据失效。为避免该情况的发生,在进行“服务方法-特征值”映射表中数据的检索和删除操作时,使用Redis提供的简单事务特性,使检索和删除在一个事务中完成,从而避免数据丢失。

基于以上设计,对Thrift的代码进行修改。对于客户端,在Thrift已有的TFramedTransport类的基础上派生出TCachedClientTransport类,对其flush方法进行重载,以实现客户端的缓存访问逻辑,代码如下:

对于服务端,在TFramedTransport类的基础上派生出TCachedServerTransport类,对其flush方法进行重载,以实现缓存数据的插入,代码如下:

为服务端开发人员提供TCacheManagerIf接口,以实现对缓存数据的管理,代码如下:

基于以上论述实现的基于Redis的Thrift缓存机制带来的好处主要是通过缓存已完成的处理结果,避免了服务端的重复处理过程,进而提高服务调用的访问性能,减少服务端处理对资源的消耗。因此,服务端处理耗时越长、处理所消耗的资源越多,处理结果不发生变化的时间越长,缓存机制带来的好处则越明显;反之,如果服务端处理耗时较少、资源消耗不多,服务端计算环境经常发生变化,导致处理结果也经常随之变化,缓存机制带来的好处则不明显,甚至会由于缓存的存在而导致访问性能出现下降。

4 结语

RPC是分布式架构的计算机系统中分布部署的业务单元间交换数据的主要手段,因此RPC的性能对采用分布式架构的计算机系统性能可产生关键性的影响。本文基于Redis的Thrift缓存机制,使用高性能Key-Value模式内存数据库Redis作为数据缓存与RPC框架Thrift相结合,以提高在服务端高处理时延和高处理资源消耗情况下的RPC性能,为分布式架构的计算机系统提供了提升性能的有效手段。

参考文献

[1]MARK SLEE,ADITYA AGARWAL,MARC KWIATKOWSKi.Thrift scalable cross-language services implementation[EB/OL].http://thrift.apache.org/static/files/thrift-20070401.pdf.

[2]DIWAKER GUPTA.Thrift:The missing guide[EB/OL].http://diwakergupta.github.io/thrift-missing-guide.

[3]吴洲.基于Thrift的跨编程语言Flex应用框架研究[J].计算机与现代化,2013(5):181-185.

[4]韩冰,祝永志.一种基于Thrift的跨平台单点登录实现方法[J].软件导刊,2014,13(2):48-50.

[5]曾超宇,李金香.Redis在高速缓存系统中的应用[J].微型机与应用,2013,32(12):11-13.

Thrift 篇2

故事导入

Watch the pennies and the pounds will take care of themselves.

It took Vicki Armstrong almost 19 years to save 550. Amazingly she did it one penny at a time.

Armstrong said saving the pennies helped her to learn to be careful with money. Armstrong has been storing pennies in vases, bowls and the occasional shoebox. In 1993, The Times in her hometown of Shreveport, Louisiana, US, reported she had squirreled away 14,000 pennies. Armstrong decided that even though she had 140 she would keep saving.

Her co-workers and friends have helped out over the years . “They all hand over pennies generously,” she said.

Her husband, Melvin, said he never tried to put Armstrong off her hobby, even when their bicycle rides were interrupted by tiny treasure hunts.

“She would see a penny in the road and just stop,” he said. “I would have to do circles just to let her catch up.”

谚语展现

请将下列谚语译成汉语,同时观察画线部分单词或短语的意思或所包含的英语句型。

1. From saving comes having.

2. A penny saved is a penny gained.

3. Small gains bring great wealth.

4. Find a penny,pick it up,all day long you’ll have good luck.

5. Little and often fills the purse.

6. Many a little makes a mickle(多).

7. Everything is of use to a house-keeper.

8. It is too late to spare when the bottom is bare.

谚语翻译

请同学们看看你的译文是否与下面的一致。

1. 富有来自节俭。

2. 省一文是一文。

3. 积小利,成巨富。

4. 见到小钱也捡起,终日就有好运气。

5. 一天省一口,日久省一斗。

6. 积少成多。

7. 管家手中无废物。

8. 露底方节约,为时已太晚。

梳理导学

第1句谚语包含一个十分重要的结构,你能否自己归纳一下呢?

在以介词短语及here, there, now, then, in,out, down, up, away,off等开头的句子中,而且谓语动词是come, go, arrive, lie等,主语是名词时,采用全部倒装形式。例如:

On the desk lies a nice book.桌子上放着一本漂亮的书。

There comes the bus. 车来了。

There goes the bell. 铃响了。

如果主语是人称代词时,不采用倒装形式。例如:

Here we are. 我们到了。

第2句谚语中的“saved”与“gained”充当什么成分呢?

在这句中,“saved”与“gained”均充当定语,他们分别等于“which is saved”与“which is gained”。过去分词充当定语常常含有被动含义与已完成含义。例如:

The students and teachers exposed to the H1N1 Virus (swine flu) were sent home. = The students and teachers who were exposed to the H1N1 Virus (swine flu) were sent home. 感染甲流的学生与老师被送回家了。

Don’t use words or expressions known only to people with specific knowledge. = Don’t use words or expressions which are known only to people with specific knowledge. 不要使用具有特别知识的人才能懂的单词和习惯用语。

第4句中“pick up”的用法十分活跃,在此处是“捡起”的意思。现在看看大家能否将下表中“pick up”的意思与右边的句子相匹配,并将右边字母填在下边的括号内:

1. → (); 2. → (); 3. → ();

4. → (); 5. → (); 6. → ();

7. → ()

Keys:

1. → ( G ); 2. → ( A ); 3. → ( E );

4. → ( D ); 5. → ( C ); 6. → ( F );

7. → ( B )

第7句中“of use”类似的结构,你能说说吗?

“be of+ 抽象名词”,相当于这个名词的对应形容词,表示“性质或特征”。我们常用有:of use =useful; of help=helpful; of importance = important; of significance = significant等。这些抽象名词前还可用great, much, little, no等来修饰。例如:

Do you think the Copenhagen Climate Conference is of great importance?= Do you think the Copenhagen

Climate Conference is very important? 你认为哥本哈根气候大会很重要吗?

It is of great significance for us students to do some relaxation exercises when we feel stressed. = It is very significant for us students to do some relaxation exercises when we feel stressed. 对我们学生来说,有压力的时候做些放松运动是很重要的。

巩固与提升

1. 请将下列句子中的“pick up”译成汉语。

(1) He picked up the letter and read it.

(2) I picked up a friend of mine on the way home.

(3) I managed to pick up an American news broadcast.

(4) I picked up a few words of Greek when I was there last year.

(5) The class picked up the story where we had left it before the holiday.

2. 请根据下列括号内谚语的译文,在空格内填上适当的单词。

(1) Spare well and s_____ well.(节约有钱花)

(2) Saving is g_____.(节省一分就是收入一分。节省是致富之道)

(3) Every little h_____. (点点滴滴都有用)

(4) E_____ is the easy chair of old age. (节约是老人的安乐椅。节俭防老)

(5) Industry and frugality(节约) produce

w_____. (勤俭致富)

(6) Better go to bed supperless than to r_____ in debt. (与其借贷负债,不如省吃俭用)

(7) The secret of wealth l_____ in the letters SAVE. (致富的奥秘在于节俭二字)

(8) Never spend your money b_____ you have it. (钱没到手先别花)

3. 请将下列A栏与B栏匹配,使之构成完整的谚语,并将其译成汉语。

参考答案

1. (1) 拿起 (2) 搭载 (3) 收听 (4) 学到 (5) 接着

2. (1) spend (2) getting (3) helps

(4) Economy (5) wealth (6) rise

(7) lies(8) before

3. (1) -D 该省则省,该花则花。

(2) -C 人要想有钱,既要多挣又要存。

(3) -B 年轻时省钱,年老时花钱。

(4) -E 爱惜便士,不愁英镑;积少成多。

(5) -F 不浪费,不愁缺。

(6) -A 勤是幸福的右手,俭是幸福的左手。

Thrift 篇3

When is World Thrift Day ? When did World Thrift Day come into exsistance? How do you know this festival , Or you know nothing about it? Never mind, in this article, I will introduce you something about the World Thrift Day.

World Thrift Day was established on October 31th every year. Its main theme is saving resouce and building a harmonious world. Every year, there will be a great many activities held to call up people to keep diligent and thrifty. Since many kinds of energy is facing with drying up. We human must take actions to stop it, despite a small action.

【Thrift】推荐阅读:

上一篇:梗塞前心绞痛下一篇:青春期发育

热搜文章

    相关推荐