brpc介绍、编译与使用

article/2025/8/29 19:49:40

        brpc又称为baidu-rpc,是百度开发一款“远程过程调用”网络框架。目前该项目已在github上开源——https://github.com/brpc/brpc。(转载请指明出于breaksoftware的csdn博客)

        据目前公开的资料,我们发现百度内部从2010年开始,开发过若干rpc框架:ub系列rpc(ubrpc,nova_pbrpc、public_pbrpc),hulu-pbrpc、sofa-pbrpc和本文介绍的baidu-rpc。从命名来看,我们并不太清楚ub、hulu和sofa是啥,但是可以确认的是我们知道baidu是什么意思。如果一款产品敢用公司名字来命名,可以见得该产品在公司内部的认可度——可以代表公司水平的产品。

        然后从应用方面看,brpc目前被应用于百度公司内部各种核心业务上,据github上的overview.md资料,包括:高性能计算和模型训练和各种索引和排序服务,且有超过100万以上个实例是基于brpc工作的。

        有大公司核心业务背书,我觉得这个项目还是可以玩玩的。

        目前github上有原汁原味的技术文档,似乎是直接把公司内部文件放了出来。但是我们在外网接触不到他们的核心业务,更接触不到什么UB、hulu或者sofa(似乎sofa-pbrpc也是开源的)等技术。所以部分文档我们可以无视。这样我们就可以将关注重心放在它的设计思想、性能、易用性以及和主流开源rpc的对比上。

RPC

        当然在谈这些前,需要知道什么是rpc。rpc全称是Remote Procedure Call,即远程过程调用。我们先了解下“过程调用”这个概念。比如我们有如下代码

void a() {printf("a excute\n");
}void b() {printf("b excute\n");a();
}

        a、b函数我们可以认为它们各是一个“过程”。其中b函数调用了a函数,我们可以认为b过程调用了a过程,这个步骤我们可以称为一次“过程调用”。这也是我们最普遍见到的“过程调用”形式。

        从宏观层面来看,a、b业务逻辑都在一台机器的一个进程的一个线程中被执行的;从微观层面,调用过程使用的全是本地资源——发生的变化仅限于本机的内存、CPU和显示设备。于是这个过程我们可以称为本地过程调用——Local Procedure Call。

        然而随着业务发展,a函数所要执行的业务越来越复杂,我们可能会让其独立成为一个进程而存在。这样a、b函数将在同一台机器不同进程中执行。此时b函数想调用a函数,就需要使用管道等技术进行跨进程通信。这种调用我们还是称为本地过程调用。

        再进一步,我们需要把a函数对应的逻辑作为一个独立的服务。这样承载a、b的服务可能部署于不同的机器上。此时b函数调用a函数的过程,需要跨越网络,我们称这种调用为“远过程调用”。

        那么b函数是如何“远过程调用”a函数的呢?一般a函数对应的进程会开放一个网络端口,它接受某种协议(比如HTTP)的请求,然后把结果打包成对应的协议格式返回。b函数所在的进程则发起该请求,然后接收返回结果。

        但是这种设计无意增加了代码开发者的工作量。因为本来就一个本地函数调用就能解决问题,现在却需要:编写a函数对应的服务、编写b访问网络的逻辑。这其中掺杂了网络、数据序列化等方面知识,开发难度直线上升。

        大家开始想办法,如果我们能降低上述开发难度,让开发者不需要懂网络编程、不需要懂协议解析,就像写本地调用代码一样做开发就好了。于是rpc框架就被研发出来了,市面上的google出品的grpc、facebook出品的thrift以及本文介绍的百度出品的brpc就是这类产品。

易用性

        以brpc为例,我们看一个远过程调用是如何被调用的

#include <brpc/channel.h>
#include "echo.pb.h"……brpc::Channel channel;brpc::ChannelOptions options;// 设置超时、协议等信息……example::EchoRequest request;example::EchoResponse response;// 设置参数request.set_message("hello world");// 设置调用桩example::EchoService_Stub stub(&channel);  brpc::Controller cntl;  // 发起调用stub.Echo(&cntl, &request, &response, NULL);// 检测并分析结果……

        可以见得,这段代码内容比较好的隐藏了网络知识——本地调用也存在超时和协议的概念。我们就像调用本地过程一样调用了Echo方法。

        相应的远过程调用的远端——服务端代码如下

#include <brpc/server.h>
#include "echo.pb.h"
……
namespace example {
class EchoServiceImpl : public EchoService {
public:EchoServiceImpl() {};virtual ~EchoServiceImpl() {};virtual void Echo(google::protobuf::RpcController* cntl_base,const EchoRequest* request,EchoResponse* response,google::protobuf::Closure* done) {brpc::ClosureGuard done_guard(done);brpc::Controller* cntl =static_cast<brpc::Controller*>(cntl_base);// Fill response.response->set_message(request->message());}
};
}  // namespace exampleint main(int argc, char* argv[]) {// Parse gflags. We recommend you to use gflags as well.GFLAGS_NS::ParseCommandLineFlags(&argc, &argv, true);// Generally you only need one Server.brpc::Server server;// Instance of your service.example::EchoServiceImpl echo_service_impl;if (server.AddService(&echo_service_impl, brpc::SERVER_DOESNT_OWN_SERVICE) != 0) {LOG(ERROR) << "Fail to add service";return -1;}// Start the server.brpc::ServerOptions options;options.idle_timeout_sec = FLAGS_idle_timeout_s;if (server.Start(FLAGS_port, &options) != 0) {LOG(ERROR) << "Fail to start EchoServer";return -1;}// Wait until Ctrl-C is pressed, then Stop() and Join() the server.server.RunUntilAskedToQuit();return 0;
}

        我们关注于EchoServiceImpl的实现。它主要暴露了Echo方法,我们只要填充它的业务就行了,而main函数中的套路是固定的。

        可以见得使用rpc框架大大降低了我们开发的难度。

性能

        在易用性相似的情况下,我们再对比一下brpc和grpc、thrift的差别。以下数据和图片都来源于brpc在github上公布的调研结果

同机单client→单server在不同请求包大小下的QPS(越高越好)

        上图是一个Client端向一个Server端发送的数据随着数据包大小变化而导致QPS变化的关系图。我们看到:

  • brpc随着请求包大小变大,QPS会下降得很明显。
  • thrift随着请求包大小变大,QPS下降不明显。
  • grpc随着请求包大小变大,在小于8KB的场景下变化不明显。但是8KB以上时,QPS明显下降。
  • 在数据包大小<512B时,brpc的QPS接近grpc的5倍,接近thrift的3倍多。
  • 在数据包大小<8KB时,brpc的QPS还是比grpc和thrift高。
  • 在数据包大小>8KB时,brpc的QPS比thrift低,但是比grpc高。

跨机多client→单server的QPS(越高越好)

        上图是多个Client向一个Server发请求时,Client端数量和Server的QPS数量之间的关系图。我们可以看到:

  • 随着Client数量增加,grpc和thrif的QPS没有明显增加。这意味着请求增多,grpc和thrift就需要更多的Server端来消化。
  • 随着Client数量增多,brpc的QPS迅速增加。这意味着请求增多,brpc的Server端不需要像grpc或者thrift方案那样增加太多。

同机单client→单server在不同线程数下的QPS(越高越好)

        上图反映出Server开启的线程数和QPS之间的关系。随着服务器性能越来越好,CPU核心数也越来越多,我们可以开启更多的线程数来增加服务的处理能力,所以这个关系图很有意义。

  • grpc随着线程数增加,QPS变化不明显。这意味着给grpc开启更多的线程数对QPS没有明显贡献。
  • thrift在线程数<=8时,QPS比grpc和brpc都高。但是在达到8个线程之后,QPS基本没有变化,这就意味着thrift开启超过8个线程就对QPS没有明显贡献了。
  • brpc随着线程数增加,QPS变化明显。虽然在8个线程及以下时,QPS不如thrift,但是之后随着线程数增加,QPS增加也快速增加。这说明brpc对线程的利用率是非常高的。这也意味着让brpc的服务部署在更多核心的机器上时,QPS会有更大的收益。

         brpc为什么会有此特性。这儿就需要介绍一下其使用的bthread库。据公开的资料介绍,其特点是:

  • 用户可以延续同步的编程模式,能在数百纳秒内建立bthread,可以用多种原语同步。
  • bthread所有接口可在pthread中被调用并有合理的行为,使用bthread的代码可以在pthread中正常执行。
  • 能充分利用多核。
  • better cache locality, supporting NUMA is a plus.

        除了看QPS,我们还要看处理延时。如果一个服务虽然QPS很高,但是每个请求都延迟很久处理,就会导致服务的平均响应时间变大。

跨机多client→单server在固定QPS下的延时CDF(越左越好,越直越好)       

        X轴是延时(微秒),Y轴是小于X轴延时的请求比例。这意味着变化曲线越靠近左边(延时短),越直(请求比例变化小)越好。

  • brpc的延时要优于thrift和grpc。
  • thrift同样优秀,但是grpc表现最差。

编译

        关于编译brpc,可以参见https://github.com/brpc/brpc/blob/master/docs/cn/getting_started.md。但是一些环境问题,导致有些软件不能安装,就需要自己编译了。

        我把在Ubuntu Server 18版本上的编译的过程贴出来,供大家参考。

sudo apt install make
sudo apt install gcc
sudo apt install g++
sudo apt install libleveldb-dev
sudo apt install libgflags-dev
sudo apt install openssl
sudo apt install libssl-dev

        zlib是源码编译的

wget http://www.zlib.net/zlib-1.2.11.tar.gz .
tar -xzvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure -prefix=/usr
sudo make
sudo make install

        protobuf是源码编译的

sudo apt-get install autoconf automake libtool
git clone https://github.com/google/protobuf.git
cd protobuf
./autogen.sh
./configure --prefix=/usr -with-PACKAGE=yes
cd protobuf
sudo make
sudo make install

        最后还要修改下Makefile文件——增加"-std=c++11"

protoc-gen-mcpack: src/idl_options.pb.cc src/mcpack2pb/generator.o libbrpc.a@echo "Linking $@"
ifeq ($(SYSTEM),Linux)@$(CXX) -o $@ $(HDRPATHS) -std=c++11 $(LIBPATHS) -Xlinker "-(" $^ -Wl,-Bstatic $(STATIC_LINKINGS) -Wl,-Bdynamic -Xlinker "-)" $(DYNAMIC_LINKINGS)
else ifeq ($(SYSTEM),Darwin)@$(CXX) -o $@ $(HDRPATHS) -std=c++11 $(LIBPATHS) $^ $(STATIC_LINKINGS) $(DYNAMIC_LINKINGS)
endif

        一切准备就绪,到brpc的目录下执行

sh config_brpc.sh --headers=/usr/include --libs=/usr/lib
make

        最后切换到example/echo_c++目录下,make出server和client,执行查看效果


http://chatgpt.dhexx.cn/article/m3tKcVMN.shtml

相关文章

NB-IOT与物联网

1. 物联网的技术格局 短距离(智能家居/穿戴等) --- zigbee, wifi, BLE 长距离 (LPWA 低功耗广域) --- LORA, NB-IOT 关于LORA大致了解了一下情况 . Lora 其实已经是一个很成熟的技术方案. 国外已经大范围使用,国内也有不少公司在基于LORA运营物联网系统. LORA的系统结构…

lora和nbiot的相同点,它们之间有何区别和联系?

在物联网无线数据传输中&#xff0c;有诸多方式可以选择&#xff0c;包括蓝牙、WIFI、FSK、ASK/OOK、Lora、Zigbee、NB-iot、Z-Wave.等&#xff0c; 其中lora 和NBIot 是自2016年来比较热门的两个无线通讯方式。 我们今天就和大家简单的聊聊Lora 和NBiot。 我是在2016年接触…

NB-IOT开发|nbiot开发教程《三》AT指令类模组驱动-STM32实现AT指令状态机

嵌入式开发中我们要时刻保持代码的高效与整洁看之前&#xff0c;先点赞 好习惯&#xff0c;要养成 一、前言 嵌入式开发中我们要时刻保持代码的高效与整洁。在第一节中“NB-IOT开发|nbiot开发教程《一》AT指令类模组驱动解析”我们说到AT指令模组最好的驱动-状态机。本节我们就…

基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)

一、前言 当前的场景是,在高速公路上部署温度采集设备,在高速路地表安装温度检测传感器,检测当前路段的路面实际温度。一段高速路上有多个地点需要采集温度数据。 采集温度数据需要上传到云平台进行数据存储,并且通过可视化界面展示温度变化曲线,支持查询最近几天的温度信…

NB-IoT的优势是什么?

NB-IoT的优势 &#xff1a; • 强链接&#xff1a;在同一基站的情况下&#xff0c;NB-IoT可以比现有无线技术提供50-100倍的接入数。一个扇区能够支持10万个连接&#xff0c;支持低延时敏感度、超低的设备成本、低设备功耗和优化的网络架构。举例来说&#xff0c;受限于带宽&a…

MN316_OPEN(NBIOT)物联网模块环境搭建

因为项目的需要,这里要使用NBIOT,踩了一些坑,这里总结一下! 编译 官方给的SDK如下: 按照说明,在该目录下直接运行如下指令:".\build.bat dlvs_h0 demo"即可成功编译,但是我编译的时候不成功,报错如下: 最后发现是因为我的目录太深的原因造成的,把"MN316_Op…

stm32毕业设计 NBIOT远程通信系统

文章目录 1 简介2 NBIOT 简介2.1 NBIOT 的特点2.2 NBIOT 的优点2.3 NBIOT能做什么 NBIOT 模块使用4 实现效果5 STM32 驱动NBIOT模块6 最后 1 简介 Hi&#xff0c;大家好&#xff0c;NBIOT是近几年不比较火的远程通信模块&#xff0c;是物联网的重要技术&#xff0c;今天学长向…

NB-IoT技术实战开发 ----- NB-IoT介绍

一.1------初识NB-IoT 1、NB-IoT介绍2、 物联网技术发展2.1有线物联网2.2 无线网络网 3、为什么需要NB-IOT4、NB-IOT优势5、NB-IOT解决方案亮点和价值5.1 广覆盖5.2 低功耗5.3低成本5.4 大连接 6、NB-IOT的应用1.智能抄表2.智能停车3.宠物跟踪4.else 1、NB-IoT介绍 NB-----Na…

【物联网】LoRa vs NBIoT

LoRa &#xff08;Long Range&#xff09; VS NB-IoT&#xff08;Narrow Band Internet of Things&#xff09; LoRa和NB&#xff0d;IoT是什么 通常物联网设备分为三类&#xff1a; 无需移动性&#xff0c;大数据量&#xff0c;需较宽频段&#xff1b;移动性强&#xff0…

物联网协议之NBIOT

什么是NBIOT 在物联网行业目前常用的网络通信技术主要有以下这些&#xff1a; nbiot属于一种LTE网络&#xff0c;LTE网络是目前主流的通信网络&#xff0c;覆盖完整、技术成熟&#xff0c;未来大量物联网设备都需要在LTE网络中实现通讯功能。Cat.X这个值是用来衡量用户终端设…

浅谈NBIOT

一、什么是NBIOT&#xff1f; 1、概念 窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;&#xff0c;NB-IoT构建于蜂窝网络&#xff0c;只消耗大约180KHz的带宽&#xff0c;使用License频段&#xff0c;可采取带内、保护带或独立载波等三种部署方式…

【物联网毕设基础】NBIOT 窄带物联网

文章目录 1 简介2 NBIOT简介3NB的型号介绍3.1 BC95:3.2 BC35&#xff1a;3.3 BC28&#xff1a;3.4 BC26&#xff1a;3.5 BC20&#xff1a;3.6 BC30&#xff1a; 4 NB物联网卡5 OpenCPU6 BC260模块详解6.1 基本性能6.2 引脚介绍6.3 模块供电 7 其他注意点8 最后 1 简介 Hi&…

NB-IoT学习笔记 —— NB-IoT介绍

一、简介 NB-IoT 是指窄带物联网&#xff08;Narrow Band Internet of Things&#xff09;技术&#xff0c;是一种低功耗广域&#xff08;LPWA&#xff09;网络技术标准&#xff0c;基于蜂窝技术&#xff0c;用于连接使用无线蜂窝网络的各种智能传感器和设备&#xff0c;聚焦于…

淘宝客解析url优惠链接获取商品ID

淘宝客解析商品链接获取PID 优惠链接都有一个e参数&#xff0c;提取e参数&#xff0c;直接解析e参数就可以获取推广链接的商品ID&#xff1b; 这是一个优惠推广链接:https://uland.taobao.com/coupon/edetail?ed4tkoUeRofIN%2BoQUE6FNzDiOaI9VHkxMoEVLjjyR2S%2Bki3b8ti%2Bp7j…

ANSI/CAN/UL 1973:2022 固定和运动辅助电源用电池安规要求-最新的英文2022完整版{135页}

ANSI/CAN/UL 1973:2022 Batteries for Use in Stationary andMotive Auxiliary Power Applications 固定和运动辅助电源用电池 UL1973-2022&#xff08;February25,2022&#xff09;.pdf-其它文档类资源-CSDN下载UL1973-2022&#xff08;February25,2022&#xff09;.pdf更多下…

java测试示例-生成ULID

ULID全称Universally Unique Lexicographically Sortable Identifier&#xff0c;直译就是通用唯一按字典排序的标识符&#xff0c;原始仓库是https://github.com/ulid/javascript&#xff0c;由前端开发者alizain发起&#xff0c;基于JavaScript语言。从项目中的commit历史来看…

scrapy_splash简单爬取淘宝页面信息

首先打开淘宝页面&#xff0c;搜索手机&#xff1a; https://uland.taobao.com/sem/tbsearch?refpidmm_26632258_3504122_32538762&clk104511dd93dde330d86022e9ce3a3dc46&keyword手机&page0 # 新建scrapy项目 scrapy startproject taobao # 进入项目目录: cd t…

淘宝API 优惠券查询接口

淘宝API 优惠券查询接口 item_search_coupon - 优惠券查询 返回值说明: 返回数据: Result Object: {“item”: [ {“pic_url”: “https://img.alicdn.com/bao/uploaded/i4/4190751820/O1CN01mohpC11PJbKKu33Gj_!!4190751820.jpg”, “num_iid”: “584401368799”, “se…

UL-1973-2022 储能电池安全标准

UL1973储能电池安全标准 UL-1973版发布于2013年2月15日&#xff0c;&#xff0c;最新更新2022年版。是全球储能电池系统的安全标准&#xff0c;标准主要涵盖给光伏、风能、后备电源、通信基站使用的各类储能电池&#xff0c;并包括对储能系统的结构评估和测试评估。UL1973-2022…

淘宝API 优惠券查询

item_search_coupon - 优惠券查询 Result Object: {“item”: [ {“pic_url”: “https://img.alicdn.com/bao/uploaded/i1/260030441/O1CN01jITAtS1F81EP8GV2T_!!0-item_pic.jpg”, “num_iid”: “562341312840”, “seller_id”: “260030441”, “title”: “预售红蜻蜓商…