初探brpc

article/2025/8/29 19:39:15

今天开始对百度的这块开源项目进行学习,之前一直有听说,但是没有去尝试使用,下面就自己对brpc的学习心得进行一个总结。

1、brpc的简介

brpc又称为baidu-rpc,是百度开发一款“远过程调用”网络框架。目前该项目已在github上开源:https://github.com/brpc/brpc

从开源的github上看,确实是很有水准的一款rpc,不仅是文档内容及其丰富,其中也提到了,brpc被广泛用于百度公司内部的各种核心业务上,据github上的overview.md资料,包括:高性能计算和模型训练和各种索引和排序服务,且有超过100万以上个实例是基于brpc工作的。

所以说brpc还是很有探究的必要的,本人打算从以下几个方面开始探究brpc。
理论->编译安装->测试用例->心跳包实例->多连接实例->memcached实例

2、rpc的理解

说到对rpc的理解,其实之前有很多博客都有说明,顾名思义,rpc,远程调用访问。一种用来处理远程机器之前通信问题的一种解决方案,rpc的出发点是屏蔽掉网络协议层的繁琐协议,能给给用户暴露最直接的远程调用API。

要具体的理解rpc,首先得讲一下关于过程这个概念。
过程不用理解的很复杂,过程是一个概念词,你可以认为一个功能模块时一个过程,一个进程是一个过程,一个函数执行就是一个过程。那么远程的过程调用实际就是调用远程的函数,可以这么理解。

我们在操作系统课上学习过,函数之间的调用有这么几种情况

(1)同一个进程,同一个线程内部函数调用

这个是我们最常见的函数调用,一个线程内部函数嵌套的使用,那么函数是如何调用的呢,根据操作系统的基本知识,我们知道,编译器编译的过程中会将函数调用处给出函数执行的入口地址,通过该如何地址,在线程的地址空间中找到对应要调用执行的函数。本质上还是本地调用。

(2)不同进程之间的函数调用

不同进程之间的函数调用实际是不同进程之间的通信问题,也就是IPC。IPC通信有很多种方法,比较常见的是管道,共享内存,消息队列等这些。本质上这种函数调用仍然是本地调用,因为他们访问的还是同一个机器,在同一个内存访问空间上。

(3)不同机器上跨网络的函数调用

这种就是远程调用,传统的使用远程调用都是使用socket,用户自己编写socket,然后客户端和服务端遵循某种数据流协议,进行通信,完成调用函数的功能。

rpc从某种程度上来看,也是这样的,这种远程的调用,显然会增加大量的代码开发中的工作量,因为本来一个函数调用的功能,他们需要做网络协议,数据序列化的这些逻辑,开发的难度会不断提升。

所以基于这样的问题,rpc被提出来了,一种远程调用访问协议,让开发者不需要懂网络编程、不需要懂协议解析,就像写本地调用代码一样做开发就好了。

3.常见的rpc框架

目前有很多rpc框架的开源,如下所示:

google:grpc
facebook:thrift
baidu:brpc

这些不同框架基本出发点都是和上述描述的一致,让程序开发者能更高开发网络工程,而不去考虑复杂的网络协议,数据序列化这些逻辑。

4.brpc的特性

brpc也是一种rpc,它的底层网络协议是TCP协议,它的数据的序列化是使用googl开源的protobuf,一种轻量级,简便的序列化工具。
主要具有以下的特性:

基于protobuf接口的RPC框架,也提供json等其他数据格式的支持
囊括baidu内部所有RPC协议,支持多种第三方协议
模块化设计,层次清晰,很容易添加自定义协议
全面的服务发现、负载均衡、组合访问支持
可视化的内置服务和调试工具
性能上领跑目前其他所有RPC产品

已经支持的协议:

baidu_std(默认)
hulu-pbrpc协议
nova-pbrpc协议
public/pbrpc协议
sofa-pbrpc协议
UB协议
ubrpc协议
HTTP协议
HTTPS协议
凤巢ITP协议
memcache协议
redis协议
mongo协议
hadoop rpc协议

5.性能对比

在github开源的文档中,给出了brpc和其他目前开源的rpc的性能评估的结果图,从结果上看,brpc的性能还是非常优越的。
以下的这些性能对比的结果都来自于git上公布的结果。

(1)同机单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高。

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

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

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

(3)同机单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很高,但是每个请求都延迟很久处理,就会导致服务的平均响应时间变大。

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

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

(5)总结

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

参考:
https://blog.csdn.net/breaksoftware/article/details/81564405
https://blog.csdn.net/okiwilldoit/article/details/82144578
https://github.com/brpc/brpc


http://chatgpt.dhexx.cn/article/2kQoAnAo.shtml

相关文章

高性能RPC框架BRPC核心机制分析

作者&#xff1a;tom-sun 链接&#xff1a;https://zhuanlan.zhihu.com/p/113427004 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 1. 简介 百度开源的RPC框架BRPC&#xff0c;以其高性能、低延迟、易用性等优势…

brpc internal

brpc 内部实现 thread model pthread 1:1atomic cache同步降低性能 fiber n:1 -> nginx 多核难以扩展, 用户不能做阻塞操作. context 存储contextualStack bthread_make_fcontext (boost::context)手动切换线程上下文->函数栈, 寄存器 bthread_jump_fcontext 将con…

brpc学习:bvar

一.介绍 bvar是多线程环境下的计数器类库&#xff0c;方便记录和查看用户程序中的各类数值&#xff0c;它利用了thread local存储减少了cache bouncing&#xff0c;相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销&#xff0c;也快于竞争频繁的原子操作。 brpc…

c++ http服务器之Apache工具ab压力测试(nginx与brpc)

系列服务器开发 文章目录 系列服务器开发前言一、ab是什么&#xff1f;二、ab测试实例nginx1.nginx环境准备与安装2.ab测试nginx本身的性能3.ab测试基于brpc的http服务器性能 三、ab实战之常见问题解决总结 前言 一、ab是什么&#xff1f; ab全称为&#xff1a;apache bench&a…

brpc源码学习(五)-IOBuf

目录 Block BlockRef IOBuf 主要api tls优化 IOPortal protobuf接口 首先放上官方介绍&#xff1a; brpc使用butil::IOBuf作为一些协议中的附件或http body的数据结构&#xff0c;它是一种非连续零拷贝缓冲&#xff0c;在其他项目中得到了验证并有出色的性能。IOBuf的接…

BRPC学习

一 源码地址&#xff1a;GitHub - apache/incubator-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, Recommendation etc. "brpc"…

brpc源码解析(四)—— Bthread机制

目录 一、概述二、启动入口函数三、内部启动函数四、worker工作入口五、总结 Bthread是brpc用到的一个线程库&#xff0c;也是brpc的核心之一&#xff0c;默认情况下&#xff0c;包括用户代码在内的绝大部分代码都是运行在bthread里的&#xff0c;bthread也是brpc实现高性能的基…

Springboot集成Brpc

本文代码可在总结处自取。 1、为什么要写这篇文章 最近自己做的业务在和C团队对接&#xff0c;双方需要指定接口与传输协议。原本是直接使用http协议传输json数据&#xff0c;对双方来说都比较简单可接受。但是json数据传输效率实在令人堪忧&#xff0c;导致我们不得不另寻其道…

brpc源码学习(六)- brpc server 端整体流程

brpc的使用比较容易上手&#xff0c;以官方demo为例&#xff0c;因为brpc的数据序列化依赖protobuf&#xff0c;所以首先需要定义个proto 然后继承EchoService并实现Echo方法 然后是整体流程 启动还是比较简单的&#xff0c;定义server&#xff0c;AddService&#xff0c;然后S…

brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程

目录 1.往Server里添加Service&#xff08;业务代码&#xff09;2.设置服务器参数3.启动服务器 平时的工作用到了baidu-rpc搭建rpc服务&#xff0c;作为戈君大神的大作&#xff0c;在没有开源的时候&#xff0c;这个c 的rpc框架在厂内就已经好评颇多&#xff0c;无论是性能、文…

brpc初步学习

一.BRPC介绍 BRPC百度开源的一个rpc框架&#xff0c;它具有以下特性&#xff1a; 基于protobuf接口的RPC框架&#xff0c;也提供json等其他数据格式的支持囊括baidu内部所有RPC协议&#xff0c;支持多种第三方协议模块化设计&#xff0c;层次清晰&#xff0c;很容易添加自定义…

brpc介绍、编译与使用

brpc又称为baidu-rpc&#xff0c;是百度开发一款“远程过程调用”网络框架。目前该项目已在github上开源——https://github.com/brpc/brpc。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 据目前公开的资料&#xff0c;我们发现百度内部从2010年开始&#x…

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…