bRPC 实战指南:三步跑通 C++ 高性能 RPC,附调优与选型清单
【免费下载链接】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
bRPC 是一个用 C++ 编写的工业级 RPC 框架,面向搜索、存储等高性能 RPC 场景,解决服务间调用的四个实际问题:高并发下的线程模型、长连接复用与流量治理、故障节点自动隔离、以及线上调用排障。以下内容按能力拆解,每个结论都落到具体参数、flag 与工具名上。
C++ 后端服务为什么常要换一套 RPC 框架
"OS 线程 + 阻塞 IO"的组合在高 QPS 下通常撞上四堵墙:
- 线程数即并发上限。每个请求占一个线程,线程栈与上下文切换开销随 QPS 线性增长;
- 连接反复建立。短连接反复做 TCP 握手,消耗文件描述符与内核连接表;
- 一个坏节点拖垮整批请求。流量路由到故障机器后全部等到超时,尾延迟被拉长;
- 线上不可见。变慢之后只能翻日志,回答不了"慢在哪个调用、错误集中在哪个连接"。
bRPC 的设计就是围着这四件事展开:用户态调度抬高并发上限,命名服务 + 负载均衡 + 熔断接管流量,内置 HTTP 页面让调用可见。它常见于搜索、存储、机器学习、广告、推荐这类 C++ 高性能系统。
并发调度模型:bthread 如何在少量 worker 上撑住高并发
bRPC 服务端不是"一个请求占一个 OS 线程"。底层是用户态轻量线程 bthread:worker 线程负责 IO 多路复用与事件调度,bthread 在 IO 等待处挂起、在用户态切换,一个 worker 可以驱动远超自身数量的 bthread。实现在 src/bthread/,原理见 bthread 文档。
图 1:bRPC 的 worker 线程与 bthread 的调度关系
两个实践结论:
- worker 数量由
--bthread_concurrency控制,默认等于核数。CPU 密集型保持默认即可,IO 占比高的服务可上调,让 IO 返回后的 bthread 有充足执行资源; - bthread 内的阻塞调用(如同步 call、sleep)不占住 worker,这是少量线程撑高并发的前提。但 bthread 里写死循环或长 CPU 任务仍会卡死 worker,需要借助 /bthread 内置页确认状态。
连接与流量治理:从命名服务到熔断
客户端只需要面对一个Channel,它下面叠着命名服务、负载均衡与健康检查三层。
图 2:bRPC 客户端请求链路,从 Channel 到命名服务与负载均衡
- 命名服务用字符串表达地址列表。创建 Channel 时可直接传
file://path、list://ip1,ip2、bns://name,节点变化会推送给 Channel 而不是靠轮询,机制见 负载均衡文档; - 负载均衡可插拔。内置轮询、加权轮询等策略,自定义实现也能注册成字符串,在配置文件里直接引用,换策略不必动代码;
- 默认熔断常驻。
ECONNREFUSED、ENETUNREACH等连接错误以及连续三次连接超时都会隔离节点,恢复靠周期健康检查;针对"连接能建上、请求却持续超时"的场景,把ChannelOptions.enable_circuit_breaker打开,启用按出错率的熔断,窗口参数如circuit_breaker_long_window_size均为 gflags,见 熔断文档; - backup request 对冲尾延迟。设置
ChannelOptions.backup_request_ms,首个请求超阈值未返回才发出第二个,谁先回取谁;两个集群互备可用 SelectiveChannel,见 backup request 文档。
什么时候该换负载均衡策略
判据都在 /connections 与 /vars 页面里:某节点错误数持续增长却未被隔离,先查熔断窗口配置;节点负载明显不均、且请求本身可按 key 分区时,再考虑一致性哈希或自定义负载均衡。
可观测性:慢调用怎么定位
bRPC 自带一组 HTTP 内置服务页,浏览器直接访问、无需额外部署:/vars 查 bvar 计数器,/connections 看逐连接状态与熔断次数(nBreak、RecentErr),/flags 运行时改 flag,/bthread 查 bthread 状态。见 内置服务文档。
图 3:bRPC 内置服务页面,浏览器直接访问即可排障
如何定位一次慢调用
固定三步:
- 先看 /vars 里的延迟 CDF,判断是尾延迟还是整体抬升;
- 开 rpcz 回放单次调用的完整时间线(基于 leveldb 记录,见 rpcz 文档);
- 确认是 CPU 问题后,用 CPU/heap profiler(gperftools)采样,配合 rpc_press 复现压力、rpc_replay 把线上流量重放到测试环境验证。
三步跑通第一个 bRPC 服务
第一步,获取代码并构建:
git clone https://gitcode.com/GitHub_Trending/brpc/brpc cd brpc && sh config_brpc.sh --headers=/usr/include --libs=/usr/lib && make第二步,跑通 echo 示例。进入example/echo_c++编译,后台启动./echo_server,再运行./echo_client,回显成功说明编译链与序列化链路就绪。
第三步,把客户端指向真实服务。实际项目里把示例地址换成file://之类的命名服务字符串即可,依赖安装与编译参数全集见 构建与运行说明。以上即 bRPC 入门的最短路径。
bRPC 性能调优:先动这 5 个参数
| 参数 | 调整要点 |
|---|---|
--bthread_concurrency | 默认等于核数,按 CPU/IO 占比上下调 |
timeout_ms/connect_timeout_ms | 必须满足 rpc 超时 > 连接超时,否则默认熔断永远触发不了 |
backup_request_ms | 参照延迟 CDF 取能覆盖大部分请求的分位点 |
circuit_breaker_*系列 gflags | 短/长窗口大小与错误阈值,权衡"容忍抖动"与"快速隔离" |
| 连接模式(single / pooled / short) | 按下游特性选择,长连接复用优先 |
图 4:调整 worker 数量时,压测下的 worker CPU 使用率是最直接的观测指标
图 5:延迟分布 CDF,用于设定 backup_request_ms 的合理阈值
RPC 框架选型:哪些场景该用 bRPC,哪些场景别用
适合:
- 技术栈是 C++、目标是高 QPS 低延迟的后端服务,如搜索、存储、广告、推荐;
- 流量治理需求强:命名服务、多负载均衡策略、熔断、backup request 全部内置,不用自己拼装;
- 要线上可观测性:/vars、/connections、rpcz、profiler 开箱即用。
不太适合:
- 团队主力语言是 Java / Go / Python。bRPC 生态以 C++ 为中心,跨语言互通需要额外协议层;
- 业务规模小、QPS 低,为性能收益付出 bthread 编程模型的学习成本不划算;
- 需要平台级服务网格、灰度发布等治理,底层平台已提供时应用层不必重复建设。
一句话收尾
bRPC 是编译即用、治理能力内置的 C++ 高性能 RPC 框架:bthread 解决并发,命名服务、负载均衡与熔断解决流量,内置页面解决排障。git clone https://gitcode.com/GitHub_Trending/brpc/brpc获取仓库,按 docs/official.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),仅供参考