新闻详情

新闻详情

首页 / 资讯中心 / 详情

brpc 全览:工业级 C++ RPC 框架的设计哲学、核心能力与实战入门

发布时间:2026/9/14 9:59:24来源:尧图网络
brpc 全览:工业级 C++ RPC 框架的设计哲学、核心能力与实战入门
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/brpcbrpcbetter RPC是百度内部大规模使用的工业级 RPC 框架目前在 Apache 基金会的 brpc 仓库中以 C 实现开源。本文以 docs/en/overview.md 为主线系统讲解 RPC 要解决的核心问题、brpc 的适用范围与优势并结合仓库中的源码与示例深入剖析其多协议支持、命名服务、负载均衡、连接管理、异步模型与高性能 IO 设计的底层原理。读完本文你将理解 brpc 的核心抽象Server / Channel / Controller掌握命名服务的 URL 写法与负载均衡算法选型并能在实战中快速搭建与访问 RPC 服务。一、RPC 到底解决了什么问题互联网上的机器大多通过 TCP/IP 协议相互访问但 TCP/IP 只保证可靠地把二进制数据送达远端。要在其上构建服务还有一连串问题需要抽象数据格式不同机器、不同网络可能存在字节序差异直接传输内存数据不合适业务变化导致字段增删时新老服务如何互通连接复用一个 TCP 连接能否被多个请求复用多个请求能否同时在一个连接上发送集群管理如何发现并访问一个包含大量机器的集群故障处理连接断开时该怎么办server 迟迟不回复时怎么办RPCRemote Procedure Call远程过程调用把网络交互抽象为client 访问 server 上的函数client 发送 request 后等待直到 server 收到、处理、回复后client 才根据 response 继续执行。对应地brpc 对上述问题的回答是序列化交给 protobuf用户填写protobuf::Message类型的 requestRPC 结束后从同为protobuf::Message类型的 response 中取结果。protobuf 有良好的前后兼容性方便业务增量调整字段HTTP 场景则广泛使用 JSON 序列化。连接建立与复用对用户透明用户可选择不同的连接方式——短连接short、连接池pooled、单连接single。机器发现交给命名服务可基于 DNS。每次请求由负载均衡算法从所有机器中选一台发送支持 round-robin、randomized、consistent-hashingmurmurhash3 或 md5与 locality-aware。故障处理连接断开时 RPC 会自动重试server 未在给定时间内回复时client 返回超时错误。二、RPC 的适用边界与常见质疑RPC 适用于几乎所有网络交互场景但它不是万能的抽象否则就不需要 TCP/IP 层了。在绝大多数网络交互中RPC 既能解决问题又能隔离底层网络细节。overview 文档对三个常见质疑给出了回应我的数据是二进制大块protobuf 序列化太慢首先这可能是伪命题需要用 profiler 证明真的慢才算数其次很多协议支持在 protobuf 请求之外携带二进制数据attachment以绕过序列化——这正是 echo 示例 中cntl-request_attachment()与cntl-response_attachment()的用途attachment 直接走网络 wire 而不经过 protobuf 序列化。我传输的是流式数据RPC 表达不了brpc 中很多协议支持流式数据包括 http 的 ProgressiveReader、h2 的 streams、streaming rpc以及专门的流式协议 RTMP。我的场景不需要回复简单推理可知此时请求可丢可不丢、可处理可不处理client 永远无法感知。即使真的不需要回复仍建议发送最小结构体的回复——这不大会成为瓶颈却可能是排查复杂 bug 时极有价值的线索。三、brpc 是什么百度内部 100 万 实例的工业级 RPCbrpc 是百度内部最常使用的工业级 RPC 框架在百度内被称为 baidu-rpc拥有超过 1,000,000 个实例不含 client和上千种服务。目前开源的是 C 实现。3.1 一个端口多协议并存用 brpc 可以搭建一个端口同时支持多种协议的服务也可以访问各种类型的服务restful http/https、h2/gRPC使用 brpc 的 http 实现比 libcurl 方便得多也可以从其他语言通过 HTTP/h2 JSON 访问基于 protobuf 的服务。redis 与 memcached对应 redis_client.md 和 memcache_client.md线程安全比官方 client 更方便、性能更好。rtmp/flv/hls用于搭建流媒体服务。thrift见 thrift.md线程安全比官方 client 更方便。百度内部各类协议baidu_std、streaming_rpc、hulu_pbrpc、sofa_pbrpc、nova_pbrpc、public_pbrpc、ubrpc 以及基于 nshead 的各种协议。RAFT 共识算法基于工业级 RAFT 实现搭建高可用分布式系统已随 braft 开源。rdma 支持文档标注为即将开源。3.2 调用模型与扩展能力Server 可以同步或异步处理请求。Client 支持同步、异步、半同步访问也可以用组合 channels 简化分库或并行访问。可通过 http 内置服务 调试服务运行 cpu、heap、contention profiler。可把组织内自有协议快速加入 brpc或定制各类组件包括命名服务dns、zk、etcd与负载均衡rr、random、consistent hashing。四、优势一更友好的 API——只有三个核心类brpc 的用户接口被刻意收敛为三个主要的类分别对应 server 端、client 端和参数集合Server服务端入口负责添加 service、监听端口、启动服务Channel客户端入口代表到一台或多台服务器的通信线路ControllerServer 与 Channel 共用方法分为三段——client-side、server-side 和 both-side methods用于设置超时、重试、压缩、attachment、log_id 等参数。使用 brpc 时无需关心如何初始化 XXXManager如何组合各种组件XXXController 与 XXXContext 的关系这类问题。文档以命名服务为例说明简单的事情要简单做在老的 RPC 实现中你可能需要复制一长段晦涩代码而在 brpc 中只是一个 URL 字符串// 访问 BNS 命名服务 channel.Init(bns://node-name, ...); // 访问 DNS域名服务 channel.Init(http://domain-name, ...); // 使用本地机器列表文件 channel.Init(file:///home/work/server.list, ...);这一设计在源码注释中有完整定义见 src/brpc/channel.h命名服务bns://node-name百度命名服务、file://file-path从文件加载地址、list://addr1,addr2,...逗号分隔的地址列表、http://url域名服务即 DNS负载均衡rr轮询、random随机、wr加权随机、wrr加权轮询、lalocality-aware、c_murmurhash/c_md5基于 murmurhash3 / md5 的一致性哈希当load_balancer_name为或nullptr时Init(xxx, , options)与Init(xxx, options)完全等价即把命名服务 URL 当作单点 server 地址。4.1 实战用 echo 示例快速上手仓库中的 example/echo_c/server.cpp 展示了建服务的最简流程brpc::Server server; example::EchoServiceImpl echo_service_impl; // 第二个参数为 SERVER_DOESNT_OWN_SERVICE表示 service 由调用方管理生命周期 if (server.AddService(echo_service_impl, brpc::SERVER_DOESNT_OWN_SERVICE) ! 0) { LOG(ERROR) Fail to add service; return -1; } brpc::ServerOptions options; options.idle_timeout_sec FLAGS_idle_timeout_s; if (server.Start(point, options) ! 0) { // point 默认 0.0.0.0:8000 LOG(ERROR) Fail to start EchoServer; return -1; } server.RunUntilAskedToQuit();服务实现类继承EchoService由 protobuf 生成在Echo方法中通过brpc::ClosureGuard done_guard(done)以 RAII 方式保证done-Run()被调用——这是同步处理的标准写法若需异步处理可done_guard.release()并在回调中自行触发。同时示例展示了 attachment 的用法cntl-response_attachment().append(cntl-request_attachment())二进制数据直接走网络而不经 protobuf 序列化。example/echo_c/client.cpp 展示了访问服务的最简流程brpc::Channel channel; brpc::ChannelOptions options; options.protocol FLAGS_protocol; // 默认 baidu_std options.connection_type FLAGS_connection_type; // single / pooled / short options.timeout_ms FLAGS_timeout_ms; // 超时默认 100ms options.max_retry FLAGS_max_retry; // 最大重试次数默认 3 if (channel.Init(FLAGS_server.c_str(), FLAGS_load_balancer.c_str(), options) ! 0) { LOG(ERROR) Fail to initialize channel; return -1; } // 用 stub 包装 channelstub 可被多线程共享 example::EchoService_Stub stub(channel); stub.Echo(cntl, request, response, nullptr); // done 为 nullptr 时同步等待 if (!cntl.Failed()) { LOG(INFO) response.message() latency cntl.latency_us() us; }Channel是线程安全的可被进程内所有线程共享done参数为nullptr时调用会阻塞直到响应返回或出错含超时。客户端还展示了cntl.set_log_id()、cntl.request_attachment()、cntl.set_request_checksum_type()目前仅支持 CRC32C等参数用法。五、优势二让服务更可靠——可观测性与性能工程brpc 在百度内部被广泛使用map-reduce 服务与 table 存储、高性能计算与模型训练、各类索引与排序服务等是经历过大规模生产考验的实现。brpc 尤其重视开发与维护效率通过浏览器或 curl 查看 server 内部状态分析在线服务的 cpu 热点、内存分配 与 锁竞争通过 bvar 统计各类指标并通过 /vars 查看。六、优势三更好的延时与吞吐——源码级的设计取舍尽管几乎所有 RPC 实现都宣称高性能但要在一个广泛的场景中都做到高性能仍很困难。为了统一百度内的通信架构brpc 在性能上比一般 RPC 走得更深overview 文档给出四个关键设计读与解析完全并行不区分 IO 线程与处理线程。传统实现通常区分 IO 线程 与 处理线程并把 fd 散列到 IO 线程中当一个 IO 线程在处理某个 fd 的大消息时同线程的其他 fd 都被阻塞。若只有 10 个 IO 线程一个 fd 就可能影响 10% 的 fd——这对要求 99.99% 可用性的工业级在线服务不可接受且在多租户、fd 分布不均时更糟。brpc 中不同 fd 的读取完全并发同一个 fd 上不同消息的解析也并发解析一个巨大的 protobuf message 不会影响同一 client 的其他消息。详见 io.md。写出高度并发。多个线程同时向同一个 fd 写出时单连接场景常见第一个线程在原线程直接写出其他线程以 wait-free。尽量少的锁。为处理请求创建 bthread、设置超时、根据回复找到 RPC 上下文、记录性能计数器都高度并发。即使服务跑到 50 万 QPS也很少能在 contention profiler 中看到框架引入的锁竞争。线程数按负载自动调节。传统服务器需要依据下游延迟调整线程数否则吞吐受损。brpc 中每个请求运行在一个新建的 bthread 中请求结束 bthread 即结束因此天然随负载自动调节线程数。brpc 与其他实现的性能对比见 benchmark。七、延伸阅读客户端全参数与调用方式client.md服务端全参数与异步服务server.md连接管理细节connections.md、io.md负载均衡与命名服务load_balancing.md、consistent_hashing.md、lalb.md协议接入与扩展new_protocol.md、baidu_std.md可观测性builtin_service.md、bvar.md、vars.md、cpu_profiler.md、heap_profiler.md、contention_profiler.md构建与入门getting_started.md、benchmark.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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

DeepSeek V4.1 Flash部署实战:显存估算与vLLM/SGLang框架调优 2026/9/14 10:29:28

DeepSeek V4.1 Flash部署实战:显存估算与vLLM/SGLang框架调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Windmill 仓库开发指南解读:从 AGENTS.md 看 Rust 后端与 Svelte 前端的协作开发工作流 2026/9/14 10:29:28

Windmill 仓库开发指南解读:从 AGENTS.md 看 Rust 后端与 Svelte 前端的协作开发工作流

Windmill 仓库开发指南解读:从 AGENTS.md 看 Rust 后端与 Svelte 前端的协作开发工作流 【免费下载链接】windmill Open-source developer platform to power your entire infra and turn scripts into webhooks, workflows and UIs. Fastest workflow engine (13x …

阅读更多 →
AI论文写作工具测评与高效使用指南 2026/9/14 10:29:28

AI论文写作工具测评与高效使用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
brpc Memcached 客户端完全指南:基于二进制协议的工业级访问方案 2026/9/14 10:29:28

brpc Memcached 客户端完全指南:基于二进制协议的工业级访问方案

brpc Memcached 客户端完全指南:基于二进制协议的工业级访问方案 【免费下载链接】brpc brpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement…

阅读更多 →
Java哈希碰撞原理与HashMap性能优化解析 2026/9/14 10:29:28

Java哈希碰撞原理与HashMap性能优化解析

1. 哈希碰撞现象解析:为什么"Aa"和"BB"的哈希值相同当我们在Java中计算字符串"Aa"和"BB"的哈希值时,会发现它们竟然产生了相同的哈希值。这个看似巧合的现象背后,隐藏着Java字符串哈希算法的设计特点…

阅读更多 →
FastAPI构建RAG知识库API实战指南 2026/9/14 10:26:28

FastAPI构建RAG知识库API实战指南

1. 项目概述:基于FastAPI构建RAG知识库API在自然语言处理领域,RAG(Retrieval-Augmented Generation)技术正在彻底改变知识密集型任务的处理方式。这个项目将带你用Python生态中最快的Web框架FastAPI,构建一个完整的RAG…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞