需求
我們需要設(shè)計(jì)一個(gè)系統(tǒng)便瑟,來(lái)記錄用戶(hù)使用某個(gè)功能的情況,也就是用戶(hù)每使用一次這個(gè)功能憨颠,我們就要記錄一下胳徽。
我們需要統(tǒng)計(jì)最近年,月爽彤,日养盗,小時(shí)。用戶(hù)使用這個(gè)功能的曲線圖适篙。
如果當(dāng)數(shù)據(jù)發(fā)生很大的偏離往核,我們需要發(fā)送通知給ADMIN用戶(hù)。
用戶(hù)使用該功能的QPS 在 2K 每秒
服務(wù)
就一個(gè)叫MONITOR SERVICE
存儲(chǔ)
存儲(chǔ)我們可以用文件系統(tǒng)或者NOSQL來(lái)存嚷节。
用文件系統(tǒng)的話聂儒,KEY(文件名) 就是一個(gè)功能名字,VALUE(文件內(nèi)容)硫痰,就是一組時(shí)間撮衩婚,表示什么時(shí)間用了多少次。
NOSQL 同樣效斑。
我們?cè)谟涗浀臅r(shí)候非春,首先會(huì)望不同的WEB SERVER 去發(fā)一個(gè)個(gè)請(qǐng)求,由WEB SERVER在內(nèi)存中做聚合缓屠。最后比如每隔10秒會(huì)把自己內(nèi)存中的聚合好的數(shù)據(jù)再發(fā)給 MONITOR SERVER奇昙。
再由MONITOR SERVER 來(lái)做聚合。
這是一個(gè)寫(xiě)多讀少的系統(tǒng)敌完。所以要依靠?jī)?nèi)存來(lái)優(yōu)化寫(xiě)次數(shù)储耐,而且要持久化存儲(chǔ),沒(méi)法用到CACHE滨溉。
數(shù)據(jù)量過(guò)大什湘,怎么辦?
我們可以對(duì)舊的數(shù)據(jù)做搜身业踏,我們每天啟動(dòng)一個(gè)離線的腳本禽炬,對(duì)當(dāng)前NOSQL,比如超過(guò)1天勤家,超過(guò)一周腹尖,超過(guò)一個(gè)月,超過(guò)一年的數(shù)據(jù),分別做整理热幔。按照不同的粒度乐设,重新對(duì)他們做聚合。然后就可以有效減少數(shù)據(jù)條目數(shù)绎巨。
比如昨天的數(shù)據(jù)以5分鐘為單位近尚。當(dāng)天的按每10秒位單位。
一周前的按小時(shí)為單位
一月前的按天為單位场勤。
一年前的按周為單位戈锻。
什么時(shí)候發(fā)送警告給ADMIN
比如一個(gè)功能的使用數(shù),平均每小時(shí)都會(huì)使用200左右和媳。 突然變成了100或者20.這個(gè)比例可以人為設(shè)置格遭,然后就發(fā)送郵件。
當(dāng)然我們可以基于每10秒來(lái)判斷留瞳。比如一個(gè)服務(wù)器之前每10秒都有20000個(gè)請(qǐng)求拒迅,突然沒(méi)了。說(shuō)明服務(wù)器的這個(gè)功能有異常了她倘。