高性能RPC框架-Apache brpc


bRPC 是百度开源的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。"brpc" 的含义是 "better RPC"。采用C++开发并在ApacheV2协议下授权。

bRPC 于 2014 年诞生于百度基础架构部,是一款采用 C++ 编写的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。2017 年正式在 GitHub 进行开源,并于 2018 年 11 月正式捐献给全球顶级开源社区 Apache 软件基金会 (ASF),对外开源版本的名称为 Apache bRPC,成为 ASF 孵化级项目。
据介绍,bRPC 以功能全、可扩展、高性能等特性得到越来越多用户的认可和使用,经过四年多的孵化,目前已覆盖了互联网、人工智能、搜索、推荐、电商和教育等多个行业和领域,被许多公司广泛使用并对该项目进行持续贡献,线上服务实例数已超过 600W,现已成为业界广受欢迎的开源 RPC 框架之一。可以使用它:
搭建能在一个端口支持多协议的服务, 或访问各种服务。
restful http/https, h2/gRPC。使用brpc的http实现比libcurl方便多了。从其他语言通过HTTP/h2+json访问基于protobuf的协议。
redis和memcached, 线程安全,比官方client更方便。
rtmp/flv/hls, 可用于搭建流媒体服务。
hadoop_rpc,rdma。
支持thrift , 线程安全,比官方client更方便。
各种百度内使用的协议: baidu_std, streaming_rpc, hulu_pbrpc, sofa_pbrpc, nova_pbrpc, public_pbrpc, ubrpc和使用nshead的各种协议。
基于工业级的RAFT算法实现搭建高可用分布式系统,已在braft开源。
Server能同步或异步处理请求。
Client支持同步、异步、半同步,或使用组合channels简化复杂的分库或并发访问。
通过http界面调试服务, 使用cpu, heap, contention profilers。
获得更好的延时和吞吐。
把你组织中使用的协议快速地加入brpc,或定制各类组件, 包括命名服务 (dns, zk, etcd), 负载均衡 (rr, random, consistent hashing)。
特性
囊括百度内部所有 RPC 协议,支持多种第三方协议
模块化设计,层次清晰,很容易添加自定义协议
全面的服务发现、负载均衡、组合访问支持
可视化的内置服务和调试工具
性能上领跑目前其他所有 RPC 产品
架构

最新版本:1.4
Apache bRPC 1.4.0 版本已于2023年2月中旬发布,支持 RDMA。
最新版本:1.5
bRPC 1.5.0 版本已于2023年5月上旬发布,支持一些新的功能和问题修复。
新功能
DNS 解析支持 IPv6与新增 bvar is_hidden
支持为定时器采样线程和工作线程命名
支持为不同的方法配置不同的 TimeoutConcurrentConf 配置
在 Status 内置服务中新增服务器并发数
新增 “平均延迟”Prometheus 指标
Bug 修复
修复在 RDMA 示例中常量未使用问题
修复域名服务中主机名缓冲区长度问题
修复 Socket 内存泄漏问题
修复当名字服务启动失败时无法结束等待问题
修复 libprotoc 路径错误导致 ci 失败问题
修复周期名字服务退出问题
功能增强
移除 wordexp
针对仅修改 markdown 文档的变更跳过不必要的工作流检查
优化当 nbucket 为 0 时拒绝初始化 FlatMap
优化一些违反 C++ ODR 规则的代码
FlatMap 和 FlatSet 支持自定义 allocator 内存分配器
添加 BasicStringPiece::const_pointer 类型
PtrContainer 增加运算符重载
优化确保至少能收到一个请求用以更新 average latency
优化使用 rdma 时的 cpu 开销
最新版本:1.8
1.8.0 版本现已于2024年2月中旬发布,支持多线程池等新特性。主要更新内容如下:
新功能
支持 bthread 多线程池,用 tag 区分
支持在发送完 response、析构 request/response 对象之前执行用户自定义函数
支持 url 安全的 base64 转换
支持 loongarch64 架构
支持联编 boringssl
baidu_std 协议支持用户自定义字段
支持客户端 ALPN 协议
支持 c++20 协程
支持 grpc 健康检查内置服务
支持一种多生产者、单消费者的无锁队列
支持异步日志
支持在内置服务展示内存详情
Bug 修复
在 ubuntu18.04 下的编译问题
修复大的 rdma_recv_block_type 不生效的问题
修复 http2 在 SETTINGS_HEADER_TABLE_SIZE 设置为 0 的情况下不正常的 case
修复多维度 bvar 转换成 prometheus 格式的问题
修复 bthread_usleep 在调度定时器失败时仍返回成功的问题
修复 stream 后台写入不生效的问题
修复 http verbose 模式下内存泄漏的问题
修复 window update 的阈值
修复 brpc/details/http_message.h 在 CentOS8 下编译失败的问题
修复 example 中 json2pb 编译错误
修复 scoped_refptr 的 ptr_ 成员未初始化问题
修复 ssl 初始化失败时 LoadBalancerWithNaming 的内存泄漏
其他改进
连接池保留至少一个空闲的 Socket
rpm:更新 DoublyBufferedData 所依赖的编译器
不允许 Channel 对象复制和赋值
LALB 增加尝试左子结点的逻辑,避免选不出实例
wrr 负载均衡增加回退策略
支持火焰图的最大宽度
对 HTTP GET 请求删除 Content-Length header
HTTP server 支持 100-continue 、删除请求中的 Expect header
优化 HTTP 回复 HEAD 请求的返回结果中的 Content-Length
修复 Content-Length 和 Transfer-Encoding 并存的问题
优化 ssl 读取日志与添加 fuzz 测试
优化 ParallelChannel 的 AddChannel 接口
支持 uint32 类型的 reloadable flags
编译单测时使用全局的 CMAKE_CPP_FLAGS
优化竞争: 支持 tcmalloc GetStackTrace 、减少重复的 hash 计算
gdb bthread stack 脚本支持 libc++
添加 lldb bthread stack 脚本
优化 HttpResponseSender 的 move 构造函数
把 UserDataDeleter 的类型从函数指针改成 std::function
优化文档和注释
详情可查看更新说明。
官方主页:https://brpc.apache.org

bRPC 于 2014 年诞生于百度基础架构部,是一款采用 C++ 编写的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。2017 年正式在 GitHub 进行开源,并于 2018 年 11 月正式捐献给全球顶级开源社区 Apache 软件基金会 (ASF),对外开源版本的名称为 Apache bRPC,成为 ASF 孵化级项目。
据介绍,bRPC 以功能全、可扩展、高性能等特性得到越来越多用户的认可和使用,经过四年多的孵化,目前已覆盖了互联网、人工智能、搜索、推荐、电商和教育等多个行业和领域,被许多公司广泛使用并对该项目进行持续贡献,线上服务实例数已超过 600W,现已成为业界广受欢迎的开源 RPC 框架之一。可以使用它:
搭建能在一个端口支持多协议的服务, 或访问各种服务。
restful http/https, h2/gRPC。使用brpc的http实现比libcurl方便多了。从其他语言通过HTTP/h2+json访问基于protobuf的协议。
redis和memcached, 线程安全,比官方client更方便。
rtmp/flv/hls, 可用于搭建流媒体服务。
hadoop_rpc,rdma。
支持thrift , 线程安全,比官方client更方便。
各种百度内使用的协议: baidu_std, streaming_rpc, hulu_pbrpc, sofa_pbrpc, nova_pbrpc, public_pbrpc, ubrpc和使用nshead的各种协议。
基于工业级的RAFT算法实现搭建高可用分布式系统,已在braft开源。
Server能同步或异步处理请求。
Client支持同步、异步、半同步,或使用组合channels简化复杂的分库或并发访问。
通过http界面调试服务, 使用cpu, heap, contention profilers。
获得更好的延时和吞吐。
把你组织中使用的协议快速地加入brpc,或定制各类组件, 包括命名服务 (dns, zk, etcd), 负载均衡 (rr, random, consistent hashing)。
特性
囊括百度内部所有 RPC 协议,支持多种第三方协议
模块化设计,层次清晰,很容易添加自定义协议
全面的服务发现、负载均衡、组合访问支持
可视化的内置服务和调试工具
性能上领跑目前其他所有 RPC 产品
架构

最新版本:1.4
Apache bRPC 1.4.0 版本已于2023年2月中旬发布,支持 RDMA。
最新版本:1.5
bRPC 1.5.0 版本已于2023年5月上旬发布,支持一些新的功能和问题修复。
新功能
DNS 解析支持 IPv6与新增 bvar is_hidden
支持为定时器采样线程和工作线程命名
支持为不同的方法配置不同的 TimeoutConcurrentConf 配置
在 Status 内置服务中新增服务器并发数
新增 “平均延迟”Prometheus 指标
Bug 修复
修复在 RDMA 示例中常量未使用问题
修复域名服务中主机名缓冲区长度问题
修复 Socket 内存泄漏问题
修复当名字服务启动失败时无法结束等待问题
修复 libprotoc 路径错误导致 ci 失败问题
修复周期名字服务退出问题
功能增强
移除 wordexp
针对仅修改 markdown 文档的变更跳过不必要的工作流检查
优化当 nbucket 为 0 时拒绝初始化 FlatMap
优化一些违反 C++ ODR 规则的代码
FlatMap 和 FlatSet 支持自定义 allocator 内存分配器
添加 BasicStringPiece::const_pointer 类型
PtrContainer 增加运算符重载
优化确保至少能收到一个请求用以更新 average latency
优化使用 rdma 时的 cpu 开销
最新版本:1.8
1.8.0 版本现已于2024年2月中旬发布,支持多线程池等新特性。主要更新内容如下:
新功能
支持 bthread 多线程池,用 tag 区分
支持在发送完 response、析构 request/response 对象之前执行用户自定义函数
支持 url 安全的 base64 转换
支持 loongarch64 架构
支持联编 boringssl
baidu_std 协议支持用户自定义字段
支持客户端 ALPN 协议
支持 c++20 协程
支持 grpc 健康检查内置服务
支持一种多生产者、单消费者的无锁队列
支持异步日志
支持在内置服务展示内存详情
Bug 修复
在 ubuntu18.04 下的编译问题
修复大的 rdma_recv_block_type 不生效的问题
修复 http2 在 SETTINGS_HEADER_TABLE_SIZE 设置为 0 的情况下不正常的 case
修复多维度 bvar 转换成 prometheus 格式的问题
修复 bthread_usleep 在调度定时器失败时仍返回成功的问题
修复 stream 后台写入不生效的问题
修复 http verbose 模式下内存泄漏的问题
修复 window update 的阈值
修复 brpc/details/http_message.h 在 CentOS8 下编译失败的问题
修复 example 中 json2pb 编译错误
修复 scoped_refptr 的 ptr_ 成员未初始化问题
修复 ssl 初始化失败时 LoadBalancerWithNaming 的内存泄漏
其他改进
连接池保留至少一个空闲的 Socket
rpm:更新 DoublyBufferedData 所依赖的编译器
不允许 Channel 对象复制和赋值
LALB 增加尝试左子结点的逻辑,避免选不出实例
wrr 负载均衡增加回退策略
支持火焰图的最大宽度
对 HTTP GET 请求删除 Content-Length header
HTTP server 支持 100-continue 、删除请求中的 Expect header
优化 HTTP 回复 HEAD 请求的返回结果中的 Content-Length
修复 Content-Length 和 Transfer-Encoding 并存的问题
优化 ssl 读取日志与添加 fuzz 测试
优化 ParallelChannel 的 AddChannel 接口
支持 uint32 类型的 reloadable flags
编译单测时使用全局的 CMAKE_CPP_FLAGS
优化竞争: 支持 tcmalloc GetStackTrace 、减少重复的 hash 计算
gdb bthread stack 脚本支持 libc++
添加 lldb bthread stack 脚本
优化 HttpResponseSender 的 move 构造函数
把 UserDataDeleter 的类型从函数指针改成 std::function
优化文档和注释
详情可查看更新说明。
官方主页:https://brpc.apache.org