Thrift vs  Grpc内容如下链接

http://blog.csdn.net/dazheng/article/details/48830511

背景: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/thrift
go 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, )
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{}, )
go func() {
for i := ; i < n; 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 -- qps
requests := SyntheticRequests(**) //总请求数
//buffer字节数, clientExec, 超时时间, hosts--写server所在的ip和端口,如非同一机器,保证端口可访问
exec := bthrift.NewThriftRequestExec(thrift.NewTBufferedTransportFactory(), ASExecutor, * time.Second, "127.0.0.1:9099")
recorder := make(chan interface{}, )
bender.LoadTestThroughput(intervals, requests, exec, recorder)
l := log.New(os.Stdout, "", log.LstdFlags)
h := hist.NewHistogram(, )
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:
Median:
90th:
99th:
.9th:
.99th:
Max:
Stats:
Average: 0.923222
Total requests:
Elapsed Time (sec): 59.5483
Average QPS: 151.14
Errors:
Percent errors: 100.00

6 问题与解决

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

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

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

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

go install github.com/pinterest/bender

thrift协议的服务进压力测试的更多相关文章

  1. 在Centos下使用Siege对Django服务进行压力测试

    Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续请求的压力测试.今天我们就使用Siege来对Django进行一次压力测试, ...

  2. 在Centos7.3下使用Siege对Django服务进行压力测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_87 Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续 ...

  3. 基于奇林软件kylinTOP工具的HTTP2协议的压力测试

    1.HTTP协议概述 说到http,那就应该先了解一下http协议的发展历史.关于http协议的历史,可以参考阮一峰老师的这篇博客文章HTTP 协议入门,里面介绍的比较详细了.简单来说http先后存在 ...

  4. [AapacheBench工具]web性能压力测试工具的应用与实践

    背景:网站性能压力测试是性能调优过程中必不可少的一环.服务器负载太大而影响程序效率是很常见的事情,一个网站到底能够承受多大的用户访问量经常是我们最关心的问题.因此,只有让服务器处在高压情况下才能真正体 ...

  5. 记一次压力测试和对nginx/tomcat配置的调整

    原文地址:还没找到 是一个web系统,前端使用nginx做为反向代理,处理https,并将请求转发给后端的tomcat服务. 压力测试工具选择了jmeter. 首先简单介绍一下jmeter. 它是ap ...

  6. 基于kylinTOP工具的HTTP2压力测试

    1.HTTP协议概述 说到http,那就应该先了解一下http协议的发展历史.关于http协议的历史,可以参考阮一峰老师的这篇博客文章HTTP 协议入门,里面介绍的比较详细了.简单来说http先后存在 ...

  7. HTTP压力测试工具

    HttpTest4Net是一款基于C#实现的和HTTP压力测试工具,通过工具可以简单地对HTTP服务进行一个压力测试.虽然VS.NET也集成了压力测试项目,但由于VS自身占用的资源导致了在配置不高的P ...

  8. Http压力测试工具HttpTest4Net

    HttpTest4Net是一款基于C#实现的和HTTP压力测试工具,通过工具可以简单地对HTTP服务进行一个压力测试.虽然VS.NET也集成了压力测试项目,但由于VS自身占用的资源导致了在配置不高的P ...

  9. 使用wrk进行压力测试

    最近需要对新的服务进行压力测试.比较了ab和jemeter以及wrk.最终选择wrk来作为压力测试工具,可以把cpu压到100%. 官方源码: https://github.com/wg/wrk 安装 ...

随机推荐

  1. windows 10 安装 sql 2005 安装失败

    windows 10 安装 sql 2005 安装失败 网上的方法记录: 安装中无法启动需要先用sp4的补丁文件sqlos.dll,sqlservr.exe 替换D:\Program Files (x ...

  2. js检测三角形是否包含一个点

    pointInTriangle:function(x0, y0, x1, y1, x2, y2, x3, y3) { var divisor = (y2 - y3)*(x1 - x3) + (x3 - ...

  3. day3 文件系统 内核模块 ctags

    nfs网络文件系统 smb   修改配置文件  sudo  vim /etc/samba/smb.conf    重启服务   /etc/init.d/samba restart 自制小的文件系统 1 ...

  4. 【备份】 解决acer v5 471g arch关机后自动重启的问题

    Fedora 17 on an Aspire V5-571 -- Reboot on Shutdown13 FEBRUARY 2015Update on 2/13/15: This article w ...

  5. Android:数据持久化(1/2)文件、SharedPreferences

    Summary 持久化的3种方法: 普通文件:I/O流操作文件: SharedPreferences:XML文件,通过key-value pair的形式存储数据: SQLite:Android自带数据 ...

  6. 复选框checkbox样式修改

    该方法只兼容IE9及以上 将checkbox和label关联起来, 将checkbox隐藏掉,通过点击label来点击checkbox,label的样式即可自定义. 通过checkbox:checke ...

  7. 向requestAnimationFrame的回调函数中传递参数

    其实跟setTimeout类似,我们知道传参传的是一个函数,那么我们是不是可以用一个匿名函数来包裹这个函数的执行呢function fn(fc){ console.log('fc:',fc) fc++ ...

  8. redhat7学习笔记之从零到部署javaweb项目

    REDHAT7学习笔记 1. 安装vmware10 安装过程略,下载地址:链接: https://pan.baidu.com/s/16odKKkRYBxGWDVo1cz_wxA 注意,10以上版本不在 ...

  9. Java并发--并发容器之CopyOnWriteArrayList

    原文链接:http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容, ...

  10. tableau-详细级别表达式——2、阵列分析

    tableau做阵列分析 合作时间越长的客户对销售额的贡献越大吗? 下面的视图按照客户首次购买的年份将客户分组,以便对比各个阵列的年度销售贡献额. 每个客户的最早订单日期将体现出首次购买日期.不过,由 ...