热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

thrift协议的服务进压力测试

背景:Facebook开发的远程服务调用框架ApacheThrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中创建高效的、无缝的服务,其

背景:Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。

负责的搜索服务使用thrift,之前是对其http的上游服务进行压测,从而压到该thrift服务;后续想调研一种方式能够直接对thrift服务进行压测。

thrift框架的C++小程序见:http://www.cnblogs.com/zhaoxd07/p/5387215.html

调研方向:

一 Jmeter

具体逻辑与使用Jmeter进行java请求的压测方式相似:http://www.cnblogs.com/zhaoxd07/p/4895224.html

区别在于setUp中对于协议的选择,会对结果有较大影响

TProtocol protocol = new TCompactProtocol(transport);
client
= new Service.Client(protocol);

原则为:与被测代码使用协议一致即可

二 bender

https://github.com/pinterest/bender

为Pinterest公司开发的,可以对http和thrift协议做压测,使用go语言实现的。我试了一下挺好用的,就是go语言用不太习惯

主要难点在于main.go文件的实现,与Jmeter需要注意点一致:协议的使用

具体操作步骤如下:

1  Go环境初始化

1)  下载安装     

# 下载安装go
cd
/usr/local/ 自己选择安装目录和工作目录
wget https:
//storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
tar -xzvf go1.8.3.linux-amd64.tar.gz

2) 配置环境变量   

# 环境变量配置
vim
/etc/profile 增加如下行:
#go variable
export GOROOT
=/usr/local/go
export PATH
=$PATH:/usr/local/go/bin
export GOPATH
=/data/bender/
export GOBIN
=/data/bender/bin
完成后保存 并使其生效 source /etc/profile

3) 确认变量配置是否生效

#echo $GOROOT
/usr/local/go

2  下载安装需要的插件

cd $GOPATH
go get git.apache.org/thrift.git/lib/go/thriftgo get github.com/pinterest/bender

3 准备server和client

准备server和client

因为我这是个实际项目,server已经由开发同学实现并启动,所以此时只需要准备server即可。如下

Server

 

cd $GOPATH/workspace/myProject/                # 进入我的工作目录
rz my_interface.thrift # 上传我的接口文件
thrift
-gen go my_interface.thrift # 将thrift文件转成go语言

 

4 准备压测脚本bender

编写压测文件 在myProject目录下 新建 myBender文件夹,vim main.sh如下:

package main

// import 若提示有错,就看下目录下文件是否可用
import (
"github.com/pinterest/bender"
bthrift
"github.com/pinterest/bender/thrift"
"git.apache.org/thrift.git/lib/go/thrift"
....
"github.com/pinterest/bender/hist"
)

// 准备压测数据,我用的服务的日志,解析后作为请求发送,相当于回放
func SyntheticRequests(n int) chan interface{} {
f, err :
= os.Open("./advanced_search.info")
paramList :
= make([]*as.QueryParam, 0)
if err != nil {
panic(err)
}
defer f.Close()

rd :
= bufio.NewReader(f)
for {
line, err :
= rd.ReadString('\n')

if err != nil || io.EOF == err {
break
}
else {
json_transport :
= thrift.NewTMemoryBufferLen(len([]rune(line)))
json_transport.WriteString(line)
json_protocol :
= thrift.NewTJSONProtocol(json_transport)
param :
= as.NewQueryParam()
param.Read(json_protocol)
paramList
= append(paramList, param)
}
}
max :
= len(paramList)
c :
= make(chan interface{}, 100)
go func() {
for i := 0; i {
rand.Seed(int64(time.Now().Nanosecond()))
c <- paramList[rand.Intn(max)]
}
close(c)
}()
return c
}

//重要:需要跟服务端所用协议一致
func ASExecutor(request interface{}, transport thrift.TTransport) (interface{}, error) {
pFac :
= thrift.NewTCompactProtocolFactory()
client :
= as.NewRecommendSrvClientFactory(transport, pFac)
return client.GetCampaigns(request.(*as.QueryParam))
}

// 主要是用bender的接口,完成压测
func main() {
intervals :
= bender.ExponentialIntervalGenerator(150) // 150 -- qps
requests := SyntheticRequests(150*60*1) //总请求数
//buffer字节数, clientExec, 超时时间, hosts--写server所在的ip和端口,如非同一机器,保证端口可访问
exec := bthrift.NewThriftRequestExec(thrift.NewTBufferedTransportFactory(125), ASExecutor, 100 * time.Second, "127.0.0.1:9099")
recorder :
= make(chan interface{}, 128)
bender.LoadTestThroughput(intervals, requests, exec, recorder)
l :
= log.New(os.Stdout, "", log.LstdFlags)
h :
= hist.NewHistogram(60000, 1000000)
bender.Record(recorder, bender.NewLoggingRecorder(l), bender.NewHistogramRecorder(h))
fmt.Println(h)
}

5 运行及结果

1  编译

cd $GOPATH
go install workspace
/asthrift/asbender // main.go在目录asbender下

编译后的可执行文件在目录bin下,貌似新文件不能直接覆盖旧文件,因此我会先手动删除旧文件

2 执行

如下结果是因为所请求的server未启动(因该服务现阶段不属于我维护,该结果仅做参考示例)

[root@ip bin]#./asbender
Percentiles:
Min:
0
Median:
1
90th:
1
99th:
1
99.9th: 1
99.99th: 4
Max:
10
Stats:
Average:
0.923222
Total requests:
9000
Elapsed Time (sec):
59.5483
Average QPS:
151.14
Errors:
9000
Percent errors:
100.00

6 问题与解决

 使用直接下载的bender运行时,会打印出请求的详细资料,导致压测的qps不能完成预期,可手动注释掉bender相关代码,并重新编译。

vim src/github.com/pinterest/bender/recorders.go,注释掉第44行。

 

 41 // NewLoggingRecorder creates a new log.Logger-based recorder.
42 func NewLoggingRecorder(l *log.Logger) Recorder {
43 return func(msg interface{}) {
44 // logMessage(l, msg)
45 }
46 }

 

删除目录下的pkg/linux_amd64/github.com/pinterest/bender.a文件,并重新编译:

go install github.com/pinterest/bender

 


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Hello.js 是一个用于连接OAuth2服务的JavascriptRESTFULAPI库,如Go ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 基于Axis、XFire、CXF的webservice客户端调用示例
    本文介绍了如何使用Axis、XFire、CXF等工具来实现webservice客户端的调用,以及提供了使用Java代码进行调用的示例。示例代码中设置了服务接口类、地址,并调用了sayHello方法。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • java io换行符_Java IO:为什么从stdin读取时,换行符的数字表示出现在控制台上?...
    只是为了更好地理解我在讲座中听到的内容(关于Java输入和输出流),我自己做了这个小程序:publicstaticvoidmain(String[]args)thro ... [详细]
author-avatar
怕疼不怕死
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有