
brpc源码解析
文章平均质量分 84
brpc源码解析
wxj1992
这个作者很懒,什么都没留下…
展开
-
brpc源码解析(二十)—— 用于访问下游的Channel类详解
文章目录一、ChannelBase类定义二、Channel类基本定义三、Channel参数3.1 ChannelOptions定义3.2 根据ChannelOptions为Channel设置参数四、Channel初始化以前写过访问下游的一些源码解析,但更多的是从整个处理流程上过了一遍,能够快速地熟悉处理过程,但对每个组件地具体地细节并没有过多深入,有点走马观花的感觉。相比较于那会现在对整个brpc的熟悉程度也高了很多,因此打算换个角度逐个介绍下各个设计到的组件。Brpc的客户端和服务端的通信都是基于pr原创 2021-08-07 10:49:22 · 3715 阅读 · 0 评论 -
brpc源码解析(十九)—— 双buffer数据结构DoublyBufferedData详解
文章目录一、成员变量二、构造函数和析构函数2.1 构造函数2.2 析构函数三、内部类3.1 tls锁及用户数据Wrapper3.1 读辅助类ScopedPtr3.3 修改所用的Functor四、内部调用函数4.1 直接读取函数4.2 Wrapper增删函数五、外部调用函数5.1 读函数5.2 写函数六、总结在服务端开发中,我们经常会碰到需要热加载的情况,需要在不影响持续请求的情况下更新数据,双buffer是很常见的一种手段,具体概念这里不过多展开,相关资料很多,在brpc里,有一个叫DoublyBuffe原创 2021-06-01 22:55:55 · 4223 阅读 · 9 评论 -
brpc源码解析(十八)—— MPSC队列ExecutionQueue详解
文章目录一、概述和特点二、生产和消费基本原理三、典型使用方式四、task node和相关内存分配五.启动ExecutionQueue代码解析六、提交、调度和执行相关代码解析6.1 任务提交调度6.2 执行用户函数6.3 新任务检查6.4 取消任务以前关于brpc写socket的一篇文章brpc源码解析(三)—— 请求其他服务器以及往socket写数据的机制里讲到了brpc往fd里写数据的一套机制,最近从朋友那得知原来这部分逻辑已经单独抽出来作为bthread一部分了,也就是ExecutionQueue,顾原创 2021-03-09 23:55:42 · 3194 阅读 · 0 评论 -
brpc源码解析(十七)—— bthread上的类futex同步组件butex详解
文章目录一、futex简介二、butex源码解析2.1 butex相关数据结构2.2 butex主要机制2.2.1 butex_wait2.2.2 butex_wake我们知道在linux 下,锁和其他一些同步机制都会用到futex,futex诞生后扮演着非常重要的角色,可以说futex是linux底层最重要的同步手段之一,无论是pthread_mutex还是semaphore都用到了futex,bthread作为基于pthread实现的一套线程库,自然也需要类似的线程同步机制,用于在bhtread上进行原创 2021-01-24 13:27:30 · 3039 阅读 · 0 评论 -
brpc源码解析(十六)—— 作为client的连接建立和处理详解
文章目录一.连接方式的定义二.连接方式的选择三.获取用于连接的socket3.1 获取指代具体下游服务的tmp_socket3.2 根据tmp_socket获取用于发送数据的socket3.3 连接以准备发送四.数据发送完毕后对连接的处理以前写过文章聊过brpc访问下游和发送数据的机制,但和下游连接的相关处理细节没有过多涉及,这里来聊下brpc client对于连接的相关处理。为了避免歧义,这里再贴一下官方文档对于socket的定义:*和fd相关的数据均在Socket中,是rpc最复杂的结构之一,这个结原创 2020-12-19 09:55:46 · 3056 阅读 · 5 评论 -
brpc源码解析(十五)—— bthread栈创建和切换详解
以前的文章讲到了bthread的相关机制,但主要是调度的规则等总体上的流程,关于bthread本身创建和切换相关的细节没有太多涉及,好久没更新博客了,今天来聊一下bthread是如何实现在pthread上进行创建和切换的。一.bthread的本质我们常说的linux线程指的是Light-weight process(轻量级进程,简成LWP), 在NPTL(Native POSIX Thread Library)的实现里,也就是pthread的实现里,是1:1的,也就是一个pthread对应一个LWP,而原创 2020-10-27 00:01:42 · 2982 阅读 · 17 评论 -
brpc源码解析(十四)—— 核心组件bvar详解(5)sampler详解
目录1. Sample2. SamplerCollector3. Sampler和ReducerSampler3.1 基类Sampler3.2 继承类ReducerSampler3.2.1 成员变量3.2.2 构造函数3.2.3 成员函数4. 总结这篇来聊一下bvar另外一个很重要的基础组件sampler,也就是采集器,像window等和时间窗口相关的类型需要使用sampler来定时采集,每一个需要采集的bvar对应一个sampler,sampler相关代码在sampler.h和sampler.cpp里,原创 2020-05-10 14:30:44 · 1861 阅读 · 0 评论 -
brpc源码解析(十三)—— 核心组件bvar详解(4)combiner详解
目录1. GlobalValue2. ElementContainer3. AgentCombiner3.1 定义3.2 内部结构体Agent3.3 成员变量3.3 构造函数和析构函数3.3 主要功能函数4. 总结前面介绍了agent,本篇我们来聊聊combiner,这也是bvar的一个特别重要的基础组件,整个combiner相关的都在combiner.h源文件里,由GlobalValue、El...原创 2020-04-18 09:53:15 · 1703 阅读 · 0 评论 -
brpc源码解析(十二)—— 核心组件bvar详解(3)AgentGroup类详解
目录1. 类基本定义2. 成员变量3. 函数3.1 Private函数3.1 Public的函数3. 总结上一篇从Reduce和Adder切人整体介绍了下bvar的实现机制,提到了combiner和agent,其中agent负责tls数据的管理和分配,也是bvar最核心的基本机制之一,本篇文章会根据源码介绍下agent的机制。AgentGroup类负责各个agent的分配和管理,采用了块存储。...原创 2020-04-08 22:06:33 · 1726 阅读 · 0 评论 -
brpc源码解析(十一)—— 核心组件bvar详解(2)Reducer类和Adder类解析
目录1. Reducer类2. Adder类3. 总结上一篇文章聊了下bvar的整体组织架构,本篇将从最基本的计数器Adder的使用出发,分析Reducer和Adder的源码来阐述下最基本也是最重要的bvar工作机制,后续再进一步深入分析相关基础组件和其他类型的bvar,我觉得这也是一个比较有效地阅读分析这种基础类库源码的方式。整个brpc源码解析系列其实也是这么一个组织结构,先从使用的部分切入...原创 2020-04-02 20:33:07 · 1831 阅读 · 0 评论 -
brpc源码解析(十)—— 核心组件bvar详解(1)简介和整体架构
目录1. 主要核心类及其作用2. 类变量和初始化3. push函数4. pop函数5. steal函数6. atomic_thread_fence(butil::memory_order_seq_cst)的必要性7. volatile_size函数Bvar是Brpc使用的多线程环境下的计数器类库,作为一个完善的rpc框架,在实际生产环境中统计诸如qps、连接数等各种数值是必须的,是服务监控的很重...原创 2020-03-28 21:07:26 · 5502 阅读 · 0 评论 -
brpc源码解析(九)—— 基础类WorkStealingQueue详解
目录1. 基本介绍2. 类变量和初始化3. push函数4. pop函数5. steal函数6. atomic_thread_fence(butil::memory_order_seq_cst)的必要性7. volatile_size函数前面介绍过,work stealing queue是bthread种的重要机制,worker给自己的队列里添加任务,消化任务,也如果空闲下来了就会去其他work...原创 2020-02-14 21:11:54 · 3221 阅读 · 19 评论 -
brpc源码解析(八)—— 基础类EventDispatcher详解
目录1.启动相关函数2.添加epoll_in事件函数3.添加epoll_out事件函数4.Run和RunThis函数5.获取EventDispatcher函数6.核心类变量前阵子比较忙,好久没有更新了,后续争取恢复更新频率,这次先更一篇相对简单的,介绍下EventDispatcher类,前面的文章涉及过这个概念, EventDispatcher,顾名思义,就是用来分发事件的,在brpc里面,因为...原创 2019-11-18 22:50:02 · 2138 阅读 · 4 评论 -
brpc源码解析(七)—— worker基于ParkingLot的bthread调度
前面已经介绍过了bthread的主要机制,但对于具体的调度细节没有过多涉及,本篇将在着重介绍下bhtread在各个worker(taskgroup)之间的调度方式。在brpc里,有个和调度相关的重要类ParkingLot,parking lot 本质上就是基于futex的wait/signal,以前没太多接触过futex,刚好趁着阅读brpc的源码熟悉下futex的机制。Futex是linux一...原创 2019-09-19 22:54:11 · 3076 阅读 · 21 评论 -
brpc源码解析(六)—— 基础类socket详解
目录1 基本介绍2 主要函数详解2.1 Create2.2 Address2.2 SetFailed2.3 Dereference1 基本介绍Socket在计算机领域通常指套接字,这里说的brpc里面的socket指的是一种用于方便在多线程环境下使用包括套接字在内的fd等资源的通用结构,前面的文章介绍brpc服务器启动以及发送接收请求相关内容的时候就多次设计到了这个数据结构。下面先贴一段官方文...原创 2019-09-10 23:12:29 · 3932 阅读 · 12 评论 -
brpc源码解析(五)—— 基础类resource pool详解
目录1.获取资源2.归还资源3.总结brpc是一个完整的rpc框架,其中用到了很多比较优秀的基础类,会看情况分析下这些类的源码,从这篇的resource pool开始,resource pool是很重要的基础类之一,顾名思义,就是资源池,是一个用于在多线程环境下进行资源分配和回收的类,可以理解为高度竞争环境下速度更快的new和delete。resource pool在brpc里面有着大量的使用,...原创 2019-08-28 23:40:43 · 4753 阅读 · 5 评论 -
brpc源码解析(四)—— Bthread机制
Bthread是brpc用到的一个线程库,也是brpc的核心之一,默认情况下,包括用户代码在内的绝大部分代码都是运行在bthread里的,bthread也是brpc实现高性能的基石。bhtread官方文档定义如下:bthread是baidu-rpc使用的M:N线程库,目的是在提高程序的并发度的同时,降低编码难度,并在核数日益增多的CPU上提供更好的scalability, cache loca...原创 2019-08-18 17:34:40 · 17019 阅读 · 20 评论 -
brpc源码解析(三)—— 请求其他服务器以及往socket写数据的机制
目录1.brpc请求其他server方式1.1 基于proto的rpc请求示例1.2 普通http请求示例:2.brpc写数据的机制brpc作为一个rpc框架,除了支持作为server当然也需要对调用其他server有良好的支持,这篇将着重介绍一下brpc访问其他server的具体过程以及与之相关的往socket写response的机制。1.brpc请求其他server方式brpc里发送数据...原创 2019-08-13 01:08:16 · 6585 阅读 · 22 评论 -
brpc源码解析(二)—— brpc收到请求的处理过程
作为rpc服务器,在启动过后,最主要的一个过程就是收到请求后的处理,而这就牵涉到一个网络编程相关最基本的部分:如何有效地处理socket传过来地数据。最典型的实现就是区分I/O线程和工作线程,一个或多个I/O线程负责从socket读取数据放入一个队列,然后一堆worker线程来从队列里取数据并处理,或者I/O线程读完数据直接交给worker,此类严格区分I/O线程和worker线程的机制会有几种典...原创 2019-07-29 23:39:45 · 12054 阅读 · 14 评论 -
brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程
目录1.往server里添加Service(业务代码)2.设置服务器参数3.启动服务器平时的工作用到了baidu-rpc搭建rpc服务,作为戈君大神的大作,在没有开源的时候,这个c++ 的rpc框架在厂内就已经好评颇多,无论是性能、文档、还是代码注释都很优秀,内部使用范围特别广,17年开源,开源版本叫做brpc,开源后不少大厂都有使用,目前已经进入Apache孵化器,源码以及文档的地址如下:ht...原创 2019-07-10 00:08:39 · 15504 阅读 · 11 评论