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。。。

brpc-client相关推荐

  1. 【RDMA】RDMA编程和TCP编程的区别|bRPC

    目录 RDMA RDMA和TCP编程差别 Socket API Verbs API 百度bRPC RDMA网卡和传统网卡对比说明 bandaoyu,本文随时更新:https://blog.csdn.n ...

  2. brpc学习:bvar

    一.介绍 bvar是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing,相比UbMonitor(百度内的老计数器库)几 ...

  3. Brpc 服务端收包源码分析(一)

    文章目录 server端使用 brpc::Server::AddService初始化各种数据 StartInternal内部其余服务也调用该函数 接收连接套接字StartAccept请求 ResetF ...

  4. brpc源码分析——线程模型

    brpc线程模型 从一个server的启动过程谈起,我们这里以echo server为例: int main(int argc, char* argv[]) {// gflags介绍:https:// ...

  5. brpc的精华bthread源码剖析

    首先我们先明确几个概念.何谓brpc,bthread,协程. brpc 百度内最常使用的工业级RPC框架,RPC把网络交互类比为"client端访问server端上的函数":cli ...

  6. brpc介绍、编译与使用

    brpc又称为baidu-rpc,是百度开发一款"远程过程调用"网络框架.目前该项目已在github上开源--https://github.com/brpc/brpc.(转载请指明 ...

  7. brpc学习笔记(1)

    文章目录 一.简介及各个文档学习 1.1 bvar 1.2 bthread 1.3 client 1.4 server 1.5 内置服务 1.6 工具 参考 一.简介及各个文档学习 brpc是一款RP ...

  8. 百度开源RPC框架brpc

    9 月 14 日,百度正式在 GitHub 上基于 Apache 2.0 协议开源了其 RPC 框架 brpc.brpc 是一个基于 protobuf 接口的 RPC 框架,在百度内部称为" ...

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

    目录 1.往Server里添加Service(业务代码) 2.设置服务器参数 3.启动服务器 平时的工作用到了baidu-rpc搭建rpc服务,作为戈君大神的大作,在没有开源的时候,这个c++ 的rp ...

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

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

最新文章

  1. libusb中的热插拔使用举例
  2. 飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2
  3. 排序算法时间复杂度分析
  4. a16z基金:顶级风投眼中的2019技术趋势
  5. Linux 的文件和目录管理类命令
  6. [Issue Fixed]-fatal: unable to access xxx: server certificate verification
  7. 基于jQuery鼠标点击弹出登陆框效果
  8. 匹马行天下之思维决定高度篇——编程“价”更高
  9. 使用Logic Apps从Azure Blob存储中删除超过X天的文件
  10. 带返回值的函数如何在内部同步?
  11. 利用R语言绘制世界航班路线图
  12. 服务器性能监控论文,服务器性能监控系统(本科毕业论文)
  13. 神经网络算法优化_训练神经网络的各种优化算法
  14. 容器技术Docker K8s 14 容器服务ACK基础与进阶-容器网络管理
  15. 深度学习基础之sofxmax回归
  16. uwsgi怎么启动停止
  17. 树莓派基础实验13:雨滴探测传感器实验
  18. 高等数学(第七版)同济大学 习题3-6 个人解答
  19. 置换矩阵、转置矩阵以及向量空间、子空间
  20. word删除空白页的方法和技巧详细介绍,提高工作效率!!!!!!!!!!!!

热门文章

  1. 成功者的秘密,花钱的诀窍所在!
  2. Origin绘图的步骤?
  3. 微商引流用什么礼品?从而形成裂变传播
  4. Win2k高级技巧 -----引用至某BLOG.保存了很久了.
  5. Eeprom(at24c04)调试小记
  6. webgl-画三角形
  7. (二)admin-boot项目之整合mybatis-plus
  8. Elastic:Elastic Stack 8.0.0-alpha1 发布
  9. 称为超级计算机,哪台机器被称为世界上最快的超级计算机?
  10. 视频编解码——视频编解码器工作原理