一般而言,實(shí)現(xiàn)某個(gè)特定業(yè)務(wù)的數(shù)據(jù)Pipeline都會(huì)比較長(zhǎng)绽媒,這個(gè)時(shí)候?qū)ζ渲心硞€(gè)組件進(jìn)行變更就是很有壓力的事情。我們?nèi)绾伪WC數(shù)據(jù)的準(zhǔn)確性和完整性呢是辕?
引子
以我們公司的實(shí)時(shí)帶寬計(jì)算為例获三,就是一個(gè)長(zhǎng)長(zhǎng)的Pipeline,中間經(jīng)過的組件其實(shí)是很多的石窑,比如解析模塊,指標(biāo)拼接模塊松逊,累加器模塊等肯夏,這些模塊可能是獨(dú)立部署,也可能是在一個(gè)系統(tǒng)中驯击,它們根據(jù)業(yè)務(wù)需求會(huì)經(jīng)常發(fā)生變更徊都。
因?yàn)樽罱K數(shù)據(jù)需要每一個(gè)環(huán)節(jié)的銜接和計(jì)算都沒有問題,才能得出正確的結(jié)果暇矫。然而讓人遺憾的是李根,一個(gè)變更可能不影響最終呈現(xiàn),但是其實(shí)是有問題的房轿,這種問題往往令人難以察覺。那問題來了夯接,發(fā)生變更后盔几,如何保證數(shù)據(jù)的正確性晴弃?
需要做的事情其實(shí)很多的。經(jīng)過實(shí)踐粒蜈,我們發(fā)現(xiàn)如下四個(gè)舉措可以減少變更帶來的風(fēng)險(xiǎn)。
變更前并行運(yùn)行
通常我們有一個(gè)模塊變更后注整,我們會(huì)在準(zhǔn)生產(chǎn)環(huán)境并行運(yùn)行一段時(shí)間(一般而言是一周)肿轨,對(duì)計(jì)算結(jié)果會(huì)繪制成曲線圖椒袍,然后和線上的曲線進(jìn)行擬合藻茂。如果完全重疊,則證明沒有問題优俘,具備上線條件帆焕。
這個(gè)可以保證數(shù)據(jù)的準(zhǔn)確性不恭,而且這種準(zhǔn)生產(chǎn)環(huán)境的服務(wù)器資源也是值得投入的换吧。
探針
探針可以檢測(cè)全流程數(shù)據(jù)是否會(huì)丟失,而且能檢驗(yàn)延時(shí)情況筋遭。 探針可以是數(shù)據(jù)源提供的,也可以是自己仿造的编饺。
這個(gè)可以一定程度上保證數(shù)據(jù)的完整性透且。
離線數(shù)據(jù)存儲(chǔ)
離線數(shù)據(jù)需要得到保留,可以是最原始的數(shù)據(jù)秽誊,也可以是某個(gè)中間結(jié)果的數(shù)據(jù)琳骡,還可以是某個(gè)數(shù)據(jù)的偏移量(譬如Kafka的偏移量)锅论,這樣可以保證上線變更導(dǎo)致計(jì)算異常(邏輯上的或者物理上的)能夠得到補(bǔ)救。一旦有異常楣号,可以拿這些離線數(shù)據(jù)進(jìn)行計(jì)算恢復(fù)數(shù)據(jù)曲線最易。實(shí)時(shí)計(jì)算中很大的一個(gè)問題是發(fā)生故障或者程序邏輯異常時(shí)導(dǎo)致某一段時(shí)間區(qū)段的結(jié)果計(jì)算不準(zhǔn)確了。
埋點(diǎn)統(tǒng)計(jì)
當(dāng)然炫狱,真正要實(shí)現(xiàn)全鏈路的質(zhì)量監(jiān)控藻懒,保證不發(fā)生問題或者及時(shí)發(fā)現(xiàn)問題,還是需要對(duì)每個(gè)環(huán)節(jié)設(shè)置各種指標(biāo)视译,我們其實(shí)對(duì)各個(gè)環(huán)節(jié)也抽象出了很多指標(biāo)嬉荆,通過一個(gè)高效的計(jì)數(shù)系統(tǒng)來實(shí)現(xiàn)。這里唯一的問題是需要進(jìn)行埋點(diǎn)酷含。
總結(jié)
質(zhì)量控制其實(shí)是一個(gè)比較復(fù)雜的問題员寇,上面的做的事情通過并行運(yùn)算確保最終結(jié)果無異常,離線數(shù)據(jù)存儲(chǔ)保證數(shù)據(jù)計(jì)算結(jié)果的可恢復(fù)第美,探針可以檢測(cè)延時(shí)或者數(shù)據(jù)的完整性蝶锋,埋點(diǎn)可以讓我們對(duì)各個(gè)組件的狀態(tài)有更多的追蹤扳缕。