比流量或者訂單淘寶可以把我們甩出幾條大街搞挣。淘寶的兄弟可以自豪地說他們的實時應(yīng)用已經(jīng)承受住了雙十一全世界范圍內(nèi)最大的單日數(shù)據(jù)流的沖擊。而阿里巴巴中文站的流量和訂單與淘寶相比則少的可憐。同時B2B自身業(yè)務(wù)又存在不同的特點双泪,我們的客單價和筆單價要高得多坞古,因此對于實時數(shù)據(jù)的誤差是零容忍的(比如丟了一個幾百萬的單子,那實時數(shù)據(jù)就沒有參考價值了)酱鸭。
所以中文站的實時應(yīng)用的特點是零誤差吗垮,事務(wù)性,故障可恢復(fù)凹髓。
在開發(fā)實時應(yīng)用的過程中烁登,我發(fā)現(xiàn)當實時計算需要保證數(shù)據(jù)完全不出錯的時候,邏輯就變得復(fù)雜起來蔚舀。效率和精度本身就是不可兼得的饵沧。
1、假設(shè)實時應(yīng)用在運行的過程中服務(wù)器突然宕機赌躺,或者應(yīng)用需要重啟狼牺。當應(yīng)用重新啟動時要能夠載入應(yīng)用停掉時刻的狀態(tài)。雖然我使用的Storm框架可以保證數(shù)據(jù)流的失敗重發(fā)礼患,但是數(shù)據(jù)計算的一些中間狀態(tài)還是必須要持久化下來是钥。例如計算UV,如果不持久化保存會員ID或cookie ID讶泰,就無法做去重處理并得到最終的UV咏瑟。而流計算一旦要做涉及到磁盤I/0的持久化操作,效率必然會大打折扣痪署。
2码泞、持久化操作帶來的另一個難點是保證事務(wù)性。例如我們要將數(shù)據(jù)寫入到數(shù)據(jù)庫狼犯,當寫入多個表時一定要保證多表的數(shù)據(jù)同時commit余寥,否則當應(yīng)用異常中斷重新從數(shù)據(jù)庫中載入中間狀態(tài)數(shù)據(jù)時,由于數(shù)據(jù)庫中的數(shù)據(jù)不一致就會導(dǎo)致最終計算結(jié)果的錯誤悯森。當然宋舷,對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫來說保證事務(wù)性是小菜一碟,但是對于一些分布式數(shù)據(jù)庫或者NOSQL數(shù)據(jù)庫(例如Hbase)來說保證事務(wù)性并非易事甚至是做不到的瓢姻。
3祝蝠、當數(shù)據(jù)量大到一定程度時就要使用并發(fā),當并發(fā)需要考慮容錯與事務(wù)性時處理邏輯又會變得復(fù)雜起來。在Storm中绎狭,每個bolt可以啟動多個task细溅,每一個task會有一個唯一的task ID。當需要持久化操作時儡嘶,每個task必須把自己的中間狀態(tài)連帶自己的task ID一起持久化下來喇聊,而在故障恢復(fù)時,每個task只從數(shù)據(jù)庫中讀取屬于自己的狀態(tài)數(shù)據(jù)蹦狂,否則很容易導(dǎo)致內(nèi)存溢出誓篱。再加上有些業(yè)務(wù)邏輯要求多個task的數(shù)據(jù)必須在數(shù)據(jù)庫中一起commit,這又增加了復(fù)雜性凯楔。
4窜骄、如果在使用并發(fā)時想動態(tài)地調(diào)整并發(fā)數(shù),那需要增加很多額外的處理邏輯啼辣。因為Storm默認的fieldsGrouping是根據(jù)并發(fā)數(shù)進行Hash計算取模啊研。如果并發(fā)數(shù)變動御滩,那么每個數(shù)據(jù)流應(yīng)該分配到哪個task中也就發(fā)生了變動鸥拧。在故障恢復(fù)時,如果并發(fā)數(shù)發(fā)生了變化削解,每個task的task ID也會發(fā)生變化富弦,這會導(dǎo)致一個task從數(shù)據(jù)庫中讀取不到本來屬于自己的那部分中間狀態(tài)數(shù)據(jù)。這時需要采用一致性Hash策略來解決該問題氛驮。
5腕柜、Storm處理事務(wù)性應(yīng)用時是按照batch來接收和處理數(shù)據(jù)的。當一批數(shù)據(jù)跨在兩天的交界處時矫废,一批數(shù)據(jù)中既有前一天的數(shù)據(jù)盏缤,又有后一天的數(shù)據(jù)。如果應(yīng)用是按天為維度來計算的蓖扑,就要保證不能把前一天的數(shù)據(jù)算在后一天里面唉铜,也不能把后一天的數(shù)據(jù)算在前一天里。例如計算一天的GMV律杠,理論上講潭流,因為數(shù)據(jù)存在延遲,當bolt接收到第二天的訂單數(shù)據(jù)時柜去,自己的服務(wù)器時間也應(yīng)該是第二天灰嫉。但是有可能不同的服務(wù)器時間存在誤差,一個bolt有可能接收到在自己看來不是當天而實際上是當天的訂單嗓奢,這在程序處理時也應(yīng)該考慮讼撒,否則就無法保證數(shù)據(jù)零誤差。
總之,阿里巴巴中文站的特點是流量與訂單量小根盒,但是客單價與筆單價大瞻颂,實時計算如果不能保證數(shù)據(jù)準確性,計算結(jié)果與實際結(jié)果將產(chǎn)生比較大的誤差郑象,失去應(yīng)用價值贡这。為了保證數(shù)據(jù)準確性,就要犧牲一定的性能厂榛。同時盖矫,B2B的業(yè)務(wù)與市場正在迅速地發(fā)展,流計算所需要處理的數(shù)據(jù)流也會成倍地增長击奶,因此我們必須不斷尋求與優(yōu)化算法與策略辈双,在精度與性能兩方面把握平衡。