brpc-client
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,修改返回结果的合并规则);
发送数据:
- CallMethod-》controler设置一些参数,创建callid,启动timer(设置backup_request_ms,就用这个,否则用这个);
- IssueRPC-》设置_current_call相关数据,包括获取的socket;如果是pool/short,则额外获取sending_sock;
- 非阻塞,nodelay socket,设置缓冲区大小,tos/ip优先级,FD_CLOEXEC,边缘触发;
- 去全局派发器池,通过fd哈希找到派发器,添加读事件;(全局派发器池中,每个派发器就是epoll bthread,wait;
- epoll处理事件顺序,遍历读处理,再遍历写处理;
- 打包请求_pack_request,由protocol实现,封装RpcMeta;
- write,如果没有链接,调用connect
- 创建EpollOutRequest,创建临时socket,添加写事件;
- 创建定时器,时间是connect_timeout_ms,HandleEpollOutTimeout,EpollOutRequest析构则定时器被删除;
- 事件回调,KeepWriteIfConnected-》CheckConnectedAndKeepWrite-》AfterAppConnected,创建KeepWrite bthread;遍历req指针,直到链表结束,持续向fd写入req数据;
- 向fd写数据;
- 去全局派发器池,通过fd哈希找到派发器,添加事件;
- 没有done的话,Join,初始创建的call id;
- write逻辑还是比较复杂的,配合KeepWrite bthread,包括错误重试机制;
controler:
_single_server_id,决定是否是链接单个server,如果负载均衡是空的话;
- 该情况,channel init时候调用SocketMapInsert,创建全局SocketMap,GlobalSocketCreator
- 初始化FLAGS_idle_timeout_second,FLAGS_defer_close_second
- insert 到butil::FlatMap<SocketMapKey, SingleConnection,SocketMapKeyHasher> Map;
- insert-》InputMessenger提供参数健康检查,回调函数等-》Socket::Create创建socket,通过每个线程维护一个ResourcePool,创建资源,利用__builtin_expect做条件语句优化;
- 对_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。。。
brpc-client相关推荐
- 【RDMA】RDMA编程和TCP编程的区别|bRPC
目录 RDMA RDMA和TCP编程差别 Socket API Verbs API 百度bRPC RDMA网卡和传统网卡对比说明 bandaoyu,本文随时更新:https://blog.csdn.n ...
- brpc学习:bvar
一.介绍 bvar是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing,相比UbMonitor(百度内的老计数器库)几 ...
- Brpc 服务端收包源码分析(一)
文章目录 server端使用 brpc::Server::AddService初始化各种数据 StartInternal内部其余服务也调用该函数 接收连接套接字StartAccept请求 ResetF ...
- brpc源码分析——线程模型
brpc线程模型 从一个server的启动过程谈起,我们这里以echo server为例: int main(int argc, char* argv[]) {// gflags介绍:https:// ...
- brpc的精华bthread源码剖析
首先我们先明确几个概念.何谓brpc,bthread,协程. brpc 百度内最常使用的工业级RPC框架,RPC把网络交互类比为"client端访问server端上的函数":cli ...
- brpc介绍、编译与使用
brpc又称为baidu-rpc,是百度开发一款"远程过程调用"网络框架.目前该项目已在github上开源--https://github.com/brpc/brpc.(转载请指明 ...
- brpc学习笔记(1)
文章目录 一.简介及各个文档学习 1.1 bvar 1.2 bthread 1.3 client 1.4 server 1.5 内置服务 1.6 工具 参考 一.简介及各个文档学习 brpc是一款RP ...
- 百度开源RPC框架brpc
9 月 14 日,百度正式在 GitHub 上基于 Apache 2.0 协议开源了其 RPC 框架 brpc.brpc 是一个基于 protobuf 接口的 RPC 框架,在百度内部称为" ...
- brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程
目录 1.往Server里添加Service(业务代码) 2.设置服务器参数 3.启动服务器 平时的工作用到了baidu-rpc搭建rpc服务,作为戈君大神的大作,在没有开源的时候,这个c++ 的rp ...
- brpc源码学习(六)- brpc server 端整体流程
brpc的使用比较容易上手,以官方demo为例,因为brpc的数据序列化依赖protobuf,所以首先需要定义个proto 然后继承EchoService并实现Echo方法 然后是整体流程 启动还是比 ...
最新文章
- libusb中的热插拔使用举例
- 飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2
- 排序算法时间复杂度分析
- a16z基金:顶级风投眼中的2019技术趋势
- Linux 的文件和目录管理类命令
- [Issue Fixed]-fatal: unable to access xxx: server certificate verification
- 基于jQuery鼠标点击弹出登陆框效果
- 匹马行天下之思维决定高度篇——编程“价”更高
- 使用Logic Apps从Azure Blob存储中删除超过X天的文件
- 带返回值的函数如何在内部同步?
- 利用R语言绘制世界航班路线图
- 服务器性能监控论文,服务器性能监控系统(本科毕业论文)
- 神经网络算法优化_训练神经网络的各种优化算法
- 容器技术Docker K8s 14 容器服务ACK基础与进阶-容器网络管理
- 深度学习基础之sofxmax回归
- uwsgi怎么启动停止
- 树莓派基础实验13:雨滴探测传感器实验
- 高等数学(第七版)同济大学 习题3-6 个人解答
- 置换矩阵、转置矩阵以及向量空间、子空间
- word删除空白页的方法和技巧详细介绍,提高工作效率!!!!!!!!!!!!