brpc-client

article/2025/8/29 16:57:08

ChannelOptions:

connect_timeout_ms:连接超时时间;

timeout_ms:rpc超时时间,会起个定时器,通过controler::Failed方法获知;

max_retry:重试次数;(最终会结束RPC,数据应该会丢失)

retry_policy:

connection_type:支持链接方式,单/池/短链接;

channel:

核心内容:

  • protocol;
  • 从集群宕机后恢复时的客户端限流;
  • 同步访问、异步访问;
  • 异步发起多个请求配合Join函数;
  • parallelchannel并发操作:同时访问其包含的sub channel,并合并它们的结果(可以重写CallMapper,可以根据index修改对应sub channel发送的请求,可以重写ResponseMerger,修改返回结果的合并规则);

发送数据:

  1. CallMethod-》controler设置一些参数,创建callid,启动timer(设置backup_request_ms,就用这个,否则用这个);
  2. IssueRPC-》设置_current_call相关数据,包括获取的socket;如果是pool/short,则额外获取sending_sock;
  3. 非阻塞,nodelay socket,设置缓冲区大小,tos/ip优先级,FD_CLOEXEC,边缘触发;
  4. 去全局派发器池,通过fd哈希找到派发器,添加读事件;(全局派发器池中,每个派发器就是epoll bthread,wait;
  5. epoll处理事件顺序,遍历读处理,再遍历写处理;
  6. 打包请求_pack_request,由protocol实现,封装RpcMeta;
  7. write,如果没有链接,调用connect
    1. 创建EpollOutRequest,创建临时socket,添加写事件;
    2. 创建定时器,时间是connect_timeout_ms,HandleEpollOutTimeout,EpollOutRequest析构则定时器被删除;
    3. 事件回调,KeepWriteIfConnected-》CheckConnectedAndKeepWrite-》AfterAppConnected,创建KeepWrite bthread;遍历req指针,直到链表结束,持续向fd写入req数据;
  8. 向fd写数据;
  9. 去全局派发器池,通过fd哈希找到派发器,添加事件;
  10. 没有done的话,Join,初始创建的call id;
  11. write逻辑还是比较复杂的,配合KeepWrite bthread,包括错误重试机制;

controler:

_single_server_id,决定是否是链接单个server,如果负载均衡是空的话;

  1. 该情况,channel init时候调用SocketMapInsert,创建全局SocketMap,GlobalSocketCreator
  2. 初始化FLAGS_idle_timeout_second,FLAGS_defer_close_second
  3. insert 到butil::FlatMap<SocketMapKey, SingleConnection,SocketMapKeyHasher> Map;
  4. insert-》InputMessenger提供参数健康检查,回调函数等-》Socket::Create创建socket,通过每个线程维护一个ResourcePool,创建资源,利用__builtin_expect做条件语句优化;
  5. 对_single_server_id进行赋值;

_correlation_id,分配的call id;

结构图:

消息顺序:

如果线程保证了顺序,那么发送数据,返回错误码,会重发,这时候,也是顺序发送;

只有发送后,rpc无响应后:

  • 要么不发,允许消息丢失
  • 要么重发,但brpc不支持幂等,可能重复消费,还可能出现乱序的情况

同时,更重要的是,消费的时候,业务层如何处理:

丢失:A、B发送,A丢失,B如何如理;

乱序:A、B发送,B-》A如何和处理;

负载均衡:

算法基本就是轮询,权重轮询,随机,延迟低到高,一致性哈希(对于cache访问比较好用);

支持name service策略:bns,file,list,dns

流程:

  • 通过name service策略获取server,和上一次的数据做差集,对load balancer做增加删除;
  • 通过load balancer获取server(两种状态,可用、健康检查,健康检查会尝试恢复)

结构图:

加入zk nameservice:

库内不做具体实现,通过外部函数指针自己实现;

继承periodic naming service实现相关方法,global.cpp新添加类型并初始化;

麻烦的地方是global初始化全局,并且是额外的线程,注意new方法的实现,naming service thread会额外new,没有使用global初始化的;

note:

src/butil/config.h文件,会定义BRPC_WITH_GLOG。。。


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

相关文章

Brpc代码分析-Server端(九)

2021SCSDUSC 回到CallMethod函数。 接下来将设置各种成员&#xff0c;如超时时间&#xff0c;response等&#xff0c;因为demo中场景没有设置loadbalancer&#xff0c;所以是SingleServer 通过_serialize_request&#xff0c;这里会把request序列化到controller的request_buf&…

又一国产开源项目走向世界,百度RPC框架Apache bRPC正式成为ASF顶级项目

2023 年 1 月 26 日&#xff0c;Apache 软件基金会 (ASF) 官方正式宣布Apache bRPC 正式毕业&#xff0c;成为 Apache的顶级项目。 我听到这个消息是挺开心的&#xff0c;毕竟是又一款由国人主导的apche顶级项目&#xff0c;再次证明国内在开源界正在发挥越来越重要的作用。 …

brpc源码学习(二)-bthread的创建与切换

brpc引入m:n的线程模型&#xff0c;固定的内核线程调度运行大量的bthread以避免内核线程上下文切换带来的开销。 bthread类似协程&#xff0c;即用户态线程&#xff0c;bthread的切换不会陷入内核&#xff0c;不会进行一系列内存同步等耗时操作&#xff0c;因此bthread的切换在…

brpc搭建、编译和使用

前面介绍了brpc的理解&#xff0c;这里给出brpc官方的搭建过程&#xff0c;以及提供的测试用例&#xff0c;对brpc的使用有一个宏观的理解。 PS&#xff1a;这里必须再次称赞百度工程师门&#xff0c;brpc开源的文档非常的丰富&#xff0c;仅仅是看文档都受益匪浅&#xff0c;…

初探brpc

今天开始对百度的这块开源项目进行学习&#xff0c;之前一直有听说&#xff0c;但是没有去尝试使用&#xff0c;下面就自己对brpc的学习心得进行一个总结。 1、brpc的简介 brpc又称为baidu-rpc&#xff0c;是百度开发一款“远过程调用”网络框架。目前该项目已在github上开源…

高性能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指令模组最好的驱动-状态机。本节我们就…