brpc parallel_http 实战:一条命令并行访问数万个 HTTP 服务并聚合内置信息

发布时间:2026/9/13 12:19:41
brpc parallel_http 实战:一条命令并行访问数万个 HTTP 服务并聚合内置信息
brpc parallel_http 实战一条命令并行访问数万个 HTTP 服务并聚合内置信息【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址: https://gitcode.com/GitHub_Trending/brpc/brpc导读parallel_http是 brpc 官方提供的高并发 HTTP 访问工具可在命令行中同时发起成千上万个 HTTP 请求量级可达数万典型场景是查询线上所有 server 的内置信息如 /status、/vars供其他工具进一步过滤与聚合。阅读本文后你将掌握 parallel_http 的编译方法、全部命令行参数、典型管道用法以及其基于 bthread 与 brpc Channel 的异步并发实现原理。一、为什么需要 parallel_httpcurl 做不到的高并行度在大型分布式系统中运维排查常需要一次性查询线上全部机器的状态。brpc 每个 server 都通过 HTTP 暴露了丰富的内置服务见 内置服务说明包括 /status、/vars、/connections、/flags、/rpcz 等而parallel_http正是为批量拉取这些信息而生的命令行工具。原文档docs/cn/parallel_http.md点明了它的定位parallel_http 能同时访问大量的 http 服务几万个适合在命令行中查询线上所有 server 的内置信息供其他工具进一步过滤和聚合。为什么 curl 很难胜任关键瓶颈在并行度curl 单进程一次只能访问一个 URL即使以多个 curl 后台运行的方式并行并行度一般也只有百左右当目标机器规模达到几万台时用 curl 需要等待极长的时间且进程管理、结果汇聚都非常繁琐parallel_http 基于 brpc 的异步 HTTP Channel 与 bthread 协程调度默认即可同时保持上千个在途请求-concurrency默认 1000并可大幅调高使几万台机器的量级在合理时间内完成拉取。brpc 官方将其收录于工具分类见 README_cn.md与 rpc_press、rpc_replay、rpc_view、benchmark_http 并列是日常排障工具箱中面向 HTTP 批量访问的一环。二、获取与编译2.1 前置条件先编译 brpcparallel_http 是 brpc 源码树内自带的小工具源码位于 tools/parallel_http/parallel_http.cpp需要先按 快速开始指南 编译出 brpc 静态库后才能构建。使用 CMake 编译 brpc同时会构建 tools 下的 parallel_httpmkdir build cd build cmake .. cmake --build . -j6在 CMake 构建体系下tools/CMakeLists.txt 通过add_subdirectory(parallel_http)将其纳入构建并把可执行文件输出到${PROJECT_BINARY_DIR}/output/bintools/parallel_http/CMakeLists.txt 中将其链接到brpc-static静态库同时通过install(TARGETS parallel_http ...)支持安装到${CMAKE_INSTALL_BINDIR}。2.2 使用 Makefile 单独编译也可以进入工具目录单独编译使用 config_brpc.sh 体系时cd tools/parallel_http make对应的 Makefile 依赖仓库根目录的config.mk头文件取自output/include静态链接output/lib/libbrpc.a编译选项为-stdc14 -O2产物即为当前目录下的parallel_http可执行文件。三、命令行参数全解parallel_http 使用 gflags 解析命令行参数全部参数由源码中的DEFINE_*宏定义见 tools/parallel_http/parallel_http.cpp用法为-参数名值也可用--help查看完整说明。核心参数如下参数默认值含义-url_file空存放待访问 URL 的文件路径为空时从标准输入 stdin 逐行读取-timeout_ms1000单次 RPC 超时时间毫秒-max_retry3最大重试次数不含首次 RPC-thread_num8用于访问 URL 的 bthread 线程数-concurrency1000同时在途的 HTTP 调用数上限全局并发度-one_line_modefalse输出为URL HTTP响应单行格式-only_show_hostfalse仅打印主机名host不打印完整 URL 与路径参数间的内在约束源码可印证单线程并发额度每个线程的并发上限为FLAGS_concurrency / FLAGS_thread_num源码 parallel_http.cpp因此增大-thread_num会分摊全局并发二者需搭配调整连接超时connect_timeout_ms被设定为timeout_ms / 2源码 parallel_http.cpp即默认 1000ms 超时时建连超时为 500ms重试语义max_retry3表示在首次请求之外最多再重试 3 次配合 ChannelOptions 生效源码 parallel_http.cpp。四、使用场景与实战示例4.1 基本用法文件列表与标准输入方式一URL 列表文件# 每行一个 URL空行与首尾空白会被自动忽略 ./parallel_http -url_fileurls.txturls.txt 示例http://10.0.0.1:8000/status http://10.0.0.2:8000/status http://10.0.0.3:8000/status方式二标准输入管道cat urls.txt | ./parallel_http源码中当-url_file为空时fp stdinparallel_http.cpp随后用getline逐行读取去除末尾换行、trim_spaces()去空白后入队若读到的 URL 列表为空则直接退出parallel_http.cpp。4.2 输出格式默认多行模式与单行模式默认模式多行每条结果以####前缀开头便于 shell 工具按行切分响应体另起一行输出#### http://10.0.0.1:8000/status ...响应体内容... #### http://10.0.0.2:8000/status ...响应体内容...单行模式加-one_line_mode输出为URL 响应体的一行形式若响应体为空请求失败或空响应则输出ERROR标记。./parallel_http -url_fileurls.txt -one_line_mode # 输出形如 # http://10.0.0.1:8000/status {...} # http://10.0.0.2:8000/status ERROR仅主机名模式加-only_show_host只输出 host去掉http://前缀、截断到第一个/之前适合只关心哪些机器可达、哪些失败的场景常与-one_line_mode组合使用./parallel_http -url_fileurls.txt -one_line_mode -only_show_host4.3 典型实战全集群内置信息聚合结合 brpc 内置服务可以批量拉取整个集群的状态再交给 grep/awk 等工具过滤聚合# 1. 生成全集群 /vars 地址列表 for ip in $(cat cluster_ips.txt); do echo http://$ip:8000/vars; done urls.txt # 2. 高并发拉取只关心出错的机器 ./parallel_http -url_fileurls.txt -one_line_mode -only_show_host -concurrency2000 | grep ERROR # 3. 拉取完整状态按行分割后过滤关键指标 ./parallel_http -url_fileurls.txt -one_line_mode | grep -E latency|qps调优建议目标机器规模大、单机响应快时可同时调大-thread_num如 1632与-concurrency如 5000 以上若单机响应慢适当调大-timeout_ms避免批量超时。五、源码实现原理bthread 异步 Channel 的并发模型parallel_http 的高并行度并非来自多进程而是 brpc 的协程调度与异步 RPC。其核心结构tools/parallel_http/parallel_http.cpp可拆解为四层1. 工作线程划分bthread主程序按-thread_num创建等量的 bthreadbthread_start_background见 parallel_http.cpp每个线程以步长thread_num从 URL 列表取任务i FLAGS_thread_num见 parallel_http.cpp天然实现任务分片。2. 并发闸门原子计数全局并发通过butil::atomicint current_concurrency控制发送前fetch_add(1)若超过本线程额度则fetch_sub(1)后bthread_usleep(5000)退让等待parallel_http.cpp。注意此处等待是协程级睡眠不会阻塞 worker 线程这正是能支撑高并发的原因之一。3. 异步 HTTP 调用Channel Closure每个 URL 新建一个brpc::Channel以brpc::PROTOCOL_HTTP协议初始化parallel_http.cpp随后构造继承自google::protobuf::Closure的OnHttpCallEnd回调通过channel.CallMethod(nullptr, cntl, nullptr, nullptr, done)发起异步调用parallel_http.cpp请求 URI 由cntl.http_request().uri() url指定。回调Run()中加锁把(url, response_attachment)推入输出队列并fetch_sub(1)释放并发额度同时std::unique_ptr自销毁parallel_http.cpp。4. 主线程结果汇聚主线程循环轮询各线程的output_queueswap取出结果并打印直到打印数量等于 URL 总数nprinted ! url_list.size()见 parallel_http.cpp结束后依次bthread_join并等待所有在途并发归零parallel_http.cpp。从源码结构可以推断parallel_http 把并发控制、异步回调、结果汇聚三段逻辑解耦任何一段都不依赖阻塞式同步 I/O因此并行度上限远高于多进程 curl 方案其单线程并发额度 全局原子计数的设计也让超大并发下不会对目标集群造成瞬时冲击。六、延伸阅读内置服务清单与访问方式docs/cn/builtin_service.md/status、/vars、/connections、/flags、/rpcz 等单机 HTTP 压测工具 benchmark_httpdocs/cn/benchmark_http.mdRPC 压测/回放工具 rpc_press 与 rpc_replay 的使用说明见 README_cn.md 工具分类编译环境搭建与依赖安装docs/cn/getting_started.md【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址: https://gitcode.com/GitHub_Trending/brpc/brpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考