如何批量发送多份gRPC请求,测试服务器并发处理与一致性?
多gRPC并发请求测试方案
一、命令行工具
1. grpcurl
这是gRPC生态里常用的命令行工具,配合shell脚本就能快速实现并发请求:
- 先准备好若干份参数不同的JSON请求文件,比如
req1.json、req2.json... - 用shell后台执行命令批量触发,让请求近乎同时发出:
for i in {1..10}; do grpcurl -d @ -plaintext localhost:50051 your.package.YourService/YourMethod < req$i.json & done wait
&会把每个请求放到后台运行,wait用于等待所有请求执行完成,能保证10个请求几乎同时发送到服务器。
2. hey(支持gRPC扩展)
原本是HTTP压测工具,现在有gRPC适配版本,能直接指定并发数和总请求数:
hey -n 100 -c 10 -m POST -d '{"param":"value"}' grpc://localhost:50051/your.package.YourService/YourMethod
-n是总请求数,-c是并发数,执行后会输出响应时间、成功率等统计数据,方便后续分析。
二、代码实现(自定义请求更灵活)
如果需要每个请求的参数有细微差异,用代码实现会更灵活,以下是两种常用语言的示例:
1. Python
借助grpcio库和concurrent.futures实现并发请求:
import grpc from concurrent import futures import your_pb2 import your_pb2_grpc def send_request(param): with grpc.insecure_channel('localhost:50051') as channel: stub = your_pb2_grpc.YourServiceStub(channel) response = stub.YourMethod(your_pb2.YourRequest(param=param)) # 可添加响应校验或状态记录逻辑 # 生成10个带不同参数的请求 params = [f"test_{i}" for i in range(10)] # 启用10个线程并发执行 with futures.ThreadPoolExecutor(max_workers=10) as executor: executor.map(send_request, params)
2. Go
利用Go原生goroutine的并发特性,代码简洁高效:
package main import ( "context" "fmt" "log" "sync" "google.golang.org/grpc" "your/package/pb" ) func main() { conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) if err != nil { log.Fatalf("连接失败: %v", err) } defer conn.Close() client := pb.NewYourServiceClient(conn) var wg sync.WaitGroup // 并发发送10个请求 for i := 0; i < 10; i++ { wg.Add(1) go func(idx int) { defer wg.Done() req := &pb.YourRequest{Param: fmt.Sprintf("test_%d", idx)} resp, err := client.YourMethod(context.Background(), req) if err != nil { log.Printf("请求 %d 失败: %v", idx, err) } else { log.Printf("请求 %d 响应: %v", idx, resp) } }(i) } wg.Wait() }
三、GUI工具(替代BloomRPC)
1. Postman
Postman已支持gRPC请求,可通过集合运行器实现并发测试:
- 创建gRPC请求并保存到集合
- 打开集合运行器,设置迭代次数、并发数
- 用预请求脚本生成不同参数,实现每份请求的细微差异
2. Insomnia
和Postman功能类似,支持gRPC集合测试,可配置并发请求,还能通过环境变量或脚本动态修改请求参数。
如果需要严格控制请求同时发送,可在代码中加入同步机制(比如Go的sync.WaitGroup等待所有goroutine准备就绪后再触发请求),能进一步提升并发测试的精准度。
内容的提问来源于stack exchange,提问作者Sahaaj Singh Chawla
相关产品推荐
相关产品推荐

