libwxfreq:腾讯开源的高性能通用频率控制组件

pyaf2172 6年前
   <h2>libwxfreq</h2>    <h2>编译</h2>    <p>make</p>    <h2>安装</h2>    <ol>     <li>修改makefile文件中的HEADERINSTALLDIR和LIBINSTALLDIR变量</li>     <li>make install</li>    </ol>    <h2>单元测试</h2>    <ol>     <li>以测试文件为目标make. 例如: make demo</li>    </ol>    <h2>简介</h2>    <p>libwxfreq是一个高性能频率限制库。通过简洁的几个接口便可以实现通用的可配置的频率 限制功能。配合其他网络框架,便可以实现一个通用的高性能频率控制服务。</p>    <h2>特点:</h2>    <ol>     <li>高度可配置。统计时长可配,规则可配。</li>     <li>支持任意key类型。</li>    </ol>    <h2>配置文件</h2>    <ol>     <li>格式</li>    </ol>    <p>appid的元信息,指明apppid的统计时长。默认第一个统计时长是60s,第二个统计时</p>    <p>时长是3600s, 第三个是86400s。可以手动修改任何一个统计时长为[0, 86400]</p>    <p>[appid]</p>    <p>5 = 30, 60, 90 // appid为5的统计时长分别是30s 60s 90s</p>    <p>25 = 10, 60 // appid为25的统计时长分别是10s 60s 86400s</p>    <p>频率规则, 用于说明某个appid的阈值, 拦截等级等</p>    <p>[match_rule_name] // 规则名字,用户指明中了哪条规则</p>    <p>match_appid = 5 // 匹配的appid</p>    <p>block_level = 1 // 拦截等级, 大于0</p>    <p>rule_type = user // 规则对应的key类型</p>    <p>item = min_interval >= 4 // 具体的阈值表达式, 支持大于和等于</p>    <pre>  min_interval 表示第一个统计时长的统计值,                    mid_interval 表示第二个统计时长的统计值,                          max_interval 表示第三个统计时长的统计值.</pre>    <ol start="2">     <li>例子</li>    </ol>    <pre>  [appid]  100 = 30, 60, 90    [rule1]  match_appid = 100  item =  min_interval >= 10  block_level = 1  rule_type = user    [rule2]  match_appid = 100  item =  mid_interval >= 15   block_level = 1  rule_type = user    [rule3]  match_appid = 100  item =  max_interval >= 20  block_level = 1  rule_type = user    [rule4]  match_appid = 100  item =  min_interval >= 100  block_level = 1  rule_type = ip     [rule5]  match_appid = 100  item =  mid_interval >= 150  block_level = 1  rule_type = ip     [rule6]  match_appid = 100  item =  max_interval >= 200   block_level = 1  rule_type = ip</pre>    <h2>API接口</h2>    <p>设置规则配置文件</p>    <pre>  void SetRuleConfFile(const char *filename);  </pre>    <p>注册一个新的统计维度。type_name 指明类型名称, zero_init标志初始化时是否需要 初始化为0, key 是共享内存key,item_cnt 表示共享内存大小,最大能统计的item个 数。</p>    <pre>  int RegisterNewShmStat(const char* type_name, bool zero_init, key_t key, unsigned int item_cnt);  </pre>    <p>系统初始化</p>    <pre>  bool InitFreq();  </pre>    <p>上报一次频率到系统中。type_name 是统计类型,说明key的含义。 key是主体标识, appid 是业务标识, cnt 表示本次需要累加的次数。 例如,统计QQ号为3402393864的 用户在appid为5的服务上的频率,使用ReportAndCheck("user", 3402393864, 5, 1); 同样统计ip为202.204.105.8访问appid的5的频率,使用ReportAndCheck( "IP", 3402393864, 5, 1); 因为202.204.105.8的整形表示也是3402393864。type_name指明了 key的含义。</p>    <pre>  struct BlockResult ReportAndCheck(const char* type_name, const char *key, const uint32_t appid, const uint32_t cnt);  </pre>    <p>只检查当前是否中频率</p>    <pre>  struct BlockResult OnlyCheck(const char* type_name, const char *key, const uint32_t appid);  </pre>    <p>只上报,不检查</p>    <pre>  int OnlyReport(const char* type_name, const char *key, const uint32_t appid, const uint32_t cnt);  </pre>    <p>获取频率统计值, cnt为0获取当前统计值,不为零表示先累计再获取</p>    <pre>  struct FreqCache GetCache(const char* type_name, const char *key, const uint32_t appid, const uint32_t cnt = 0);  </pre>    <p>加白操作,linger_time表示加白有效期</p>    <pre>  int AddWhite(const char* type_name, const char *key, const uint32_t appid, const uint32_t linger_time);  </pre>    <p>删除白名单</p>    <pre>  int DeleteWhite(const char* type_name, const char *key, const uint32_t appid);  </pre>    <p>手动加拦截</p>    <pre>  int AddBlock(const char* type_name, const char *key, const uint32_t appid, const uint32_t linger_time, const uint32_t block_level);  </pre>    <p>手动删除拦截</p>    <pre>  int DeleteBlock(const char* type_name, const char *key, const uint32_t appid);  </pre>    <p>设置写日志方法,默认写本地文件/tmp/libwxfreq.log</p>    <pre>  void SetLogFunc(LogFunction logfunc);  </pre>    <p>设置重启时恢复白名单/拦截方法,默认从本地文件/tmp/libwxfreq_db.$type_name读取</p>    <pre>  void SetLoadFunc(LoadFunc func);  </pre>    <p>设置白名单/加拦截数据持久化方法。默认写本地文件/tmp/libwxfreq_db.$type_name</p>    <pre>  void SetDumpFunc(DumpFunc func);  </pre>    <p> </p>    <p> </p>    <p> </p>