libwxfreq:騰訊開源的高性能通用頻率控制組件
libwxfreq
編譯
make
安裝
- 修改makefile文件中的HEADERINSTALLDIR和LIBINSTALLDIR變量
- make install
單元測試
- 以測試文件為目標make. 例如: make demo
簡介
libwxfreq是一個高性能頻率限制庫。通過簡潔的幾個接口便可以實現通用的可配置的頻率 限制功能。配合其他網絡框架,便可以實現一個通用的高性能頻率控制服務。
特點:
- 高度可配置。統計時長可配,規則可配。
- 支持任意key類型。
配置文件
- 格式
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 表示第三個統計時長的統計值.
- 例子
[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);