libwxfreq:騰訊開源的高性能通用頻率控制組件

pyaf2172 6年前發布 | 19K 次閱讀 頻率控制 開源

libwxfreq

編譯

make

安裝

  1. 修改makefile文件中的HEADERINSTALLDIR和LIBINSTALLDIR變量
  2. make install

單元測試

  1. 以測試文件為目標make. 例如: make demo

簡介

libwxfreq是一個高性能頻率限制庫。通過簡潔的幾個接口便可以實現通用的可配置的頻率 限制功能。配合其他網絡框架,便可以實現一個通用的高性能頻率控制服務。

特點:

  1. 高度可配置。統計時長可配,規則可配。
  2. 支持任意key類型。

配置文件

  1. 格式

appid的元信息,指明apppid的統計時長。默認第一個統計時長是60s,第二個統計時

時長是3600s, 第三個是86400s。可以手動修改任何一個統計時長為[0, 86400]

[appid]

5 = 30, 60, 90 // appid為5的統計時長分別是30s 60s 90s

25 = 10, 60 // appid為25的統計時長分別是10s 60s 86400s

頻率規則, 用于說明某個appid的閾值, 攔截等級等

[match_rule_name] // 規則名字,用戶指明中了哪條規則

match_appid = 5 // 匹配的appid

block_level = 1 // 攔截等級, 大于0

rule_type = user // 規則對應的key類型

item = min_interval >= 4 // 具體的閾值表達式, 支持大于和等于

min_interval 表示第一個統計時長的統計值,                  
mid_interval 表示第二個統計時長的統計值,                        
max_interval 表示第三個統計時長的統計值.
  1. 例子
[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>

API接口

設置規則配置文件

void SetRuleConfFile(const char *filename);

注冊一個新的統計維度。type_name 指明類型名稱, zero_init標志初始化時是否需要 初始化為0, key 是共享內存key,item_cnt 表示共享內存大小,最大能統計的item個 數。

int RegisterNewShmStat(const char* type_name, bool zero_init, key_t key, unsigned int item_cnt);

系統初始化

bool InitFreq();

上報一次頻率到系統中。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的含義。

struct BlockResult ReportAndCheck(const char* type_name, const char *key, const uint32_t appid, const uint32_t cnt);

只檢查當前是否中頻率

struct BlockResult OnlyCheck(const char* type_name, const char *key, const uint32_t appid);

只上報,不檢查

int OnlyReport(const char* type_name, const char *key, const uint32_t appid, const uint32_t cnt);

獲取頻率統計值, cnt為0獲取當前統計值,不為零表示先累計再獲取

struct FreqCache GetCache(const char* type_name, const char *key, const uint32_t appid, const uint32_t cnt = 0);

加白操作,linger_time表示加白有效期

int AddWhite(const char* type_name, const char *key, const uint32_t appid, const uint32_t linger_time);

刪除白名單

int DeleteWhite(const char* type_name, const char *key, const uint32_t appid);

手動加攔截

int AddBlock(const char* type_name, const char *key, const uint32_t appid, const uint32_t linger_time, const uint32_t block_level);

手動刪除攔截

int DeleteBlock(const char* type_name, const char *key, const uint32_t appid);

設置寫日志方法,默認寫本地文件/tmp/libwxfreq.log

void SetLogFunc(LogFunction logfunc);

設置重啟時恢復白名單/攔截方法,默認從本地文件/tmp/libwxfreq_db.$type_name讀取

void SetLoadFunc(LoadFunc func);

設置白名單/加攔截數據持久化方法。默認寫本地文件/tmp/libwxfreq_db.$type_name

void SetDumpFunc(DumpFunc func);

 

 

 

 本文由用戶 pyaf2172 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!