前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >brpc的bvar解读

brpc的bvar解读

原创
作者头像
mariolu
发布2020-04-07 00:44:09
2.7K0
发布2020-04-07 00:44:09
举报
文章被收录于专栏:CDN及云技术分享

一、什么是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);

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是bvar
  • 二、bvar的结构
    • 2.1 Variable基类
      • 2.2.1 显式expose
      • 2.2.2 隐式expose
    • 2.3 Windows类和PerSecond类
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档