brpc的bvar解读

2020-04-07 00:44:09 浏览数 (1)

一、什么是bvar

bvar是brpc的几个组件之一,bvar模块相对独立,可以单独编译和应用。

图1、brpc的几个模块图1、brpc的几个模块

Bvar 有两个基本成员,名字和统计值(key和value)。Bvar使用thread local存储,这使得写没有竞争,读的时候进行合并多个线程的数据,需要同步竞争保证。

二、bvar的结构

图2、bvar的几个文件图2、bvar的几个文件

bvar大体分为这几个组成要素:

  • Reducer.h:聚合收敛数据结构,有Adder, Maxer, Miner。这3个类又统称为Reducer,Reducer的一个重要特征是满足交换结合律
  • Recorder.h包含Stat,IntRecorder,可用于计算平均值。
  • Status.h包含Status:修改Status后立即可见
  • Passive_status.h,和Status相对于的是PassiveStatus,PassiveStatus的获取依赖于用户获取操作,才触发获取值,有时候无法set_value或不知道以何种频率set_value,在需要显示时才打印。用户传入打印回调函数实现这个目的
  • Latency_recorder.h包含LatencyRecord,记录最近一段时间的数据、QPS数据
  • ScopeTimer
  • Gflag

2.1 Variable基类

这些类的基类是Variable,他主要提供全局key map注册自定义的bvar,并且加入了列举,查询等功能。

2.2.1 显式expose

varibale的expose方法注册自己到全局VarMap,同时设置key。我们可以方便的通过Brpc提供的一个服务器dump进程遍历查看VarMap。expose的使用方法如下:

代码语言:c 复制
bvar::LatencyRecorder _latency_recorder;
bvar::Adder<int64_t> _error_count;
_latency_recorder.expose("rpc_press");
_error_count.expose("rpc_press_error_count"); 

2.2.2 隐式expose

另外bvar提供了另一种构造方法。这种构造方法默认进行了expose注册操作。

比如这种,就不需要在显式调用c->expose

代码语言:javascript复制
bvar::Adder<int> c("demo");

2.3 Windows类和PerSecond类

bvar还提供一个方便的类叫Window。想象以下场景

Adder是累加的,任何时候拿到的是累計值。如果需要统计一段时间內的数据,这个就需要windows的帮助。还有如果需要计算Variabl每秒的平均值,那么就需要使用bvar::PerSecond<>。写法如下:

代码语言:javascript复制
bvar::Adder<int> demo("demo");
bvar::Window<bvar::Adder<int>> demo_window("adderWindow", &demo, 3);
bvar::PerSecond<bvar::Adder<int>> demo_persecond("adderPersecond", &demo, 1);

0 人点赞