昨天微信發(fā)生部分服務(wù)故障,媒體微博上面就此事表現(xiàn)相當(dāng)熱鬧,這也從另一方面印證了微信的江湖地位以及移動(dòng)互聯(lián)網(wǎng)改變生活的真實(shí)寫照。
從用戶角度來說,一直好好的一個(gè)東西突然壞了,很大情況下可能不會(huì)首先想到是這東西本身壞了,而是先從別的地方找原因,這也是人的一種慣性思維。 而一旦發(fā)現(xiàn)是用的這東西本身壞了,憤怒和無奈的程度會(huì)更加加倍。但是有一點(diǎn)大家想過沒有,任何一個(gè)東西的可用性都是需要有一定代價(jià)才能保證的。 越能用得長的東西,要么就是質(zhì)量一流,要么就是需要不斷檢修和維護(hù),這都需要不斷付出努力才能做到。
服務(wù)可用性落實(shí)到具體的可以衡量的指標(biāo)上來說,通常用幾個(gè)9 來表示。通常大家所說的3個(gè)9 (99.9%), 是說一個(gè)業(yè)務(wù)系統(tǒng)造成大部分用戶無法使用的時(shí)間一年中不超過 8小時(shí)46分鐘,而全球互聯(lián)網(wǎng)中的老大Google 對(duì)于服務(wù)可用性達(dá)到了5個(gè)9(99.999%), 也就是一年內(nèi)故障時(shí)間不超過 5分鐘 15 秒,這個(gè)故障時(shí)間對(duì)用戶基本無感知。對(duì)于用戶數(shù)量和交易數(shù)量可預(yù)測或者憑經(jīng)驗(yàn)就可以了解的,而又關(guān)系到國計(jì)民生的行業(yè),譬如銀行、電信企業(yè)來說,一般都要求達(dá)到5個(gè)9。 然而對(duì)于互聯(lián)網(wǎng)而言,5 個(gè)9 的服務(wù)可用性需要付出的代價(jià)和挑戰(zhàn)是相當(dāng)巨大的。
首先,在基礎(chǔ)設(shè)施方面,針對(duì)服務(wù)質(zhì)量,IDC 也分成很多等級(jí);A 級(jí)一般承諾服務(wù)可用性達(dá)到或者接近4 個(gè)9, 這就要求至少以下幾個(gè)方面: 必須多路電源接入(如果只有一路電源,萬一沒電了就瞎了),必須有支持至少 5 小時(shí)的蓄電設(shè)備、必須有獨(dú)立的發(fā)電設(shè)備、所有設(shè)備和線路冗余備份(是所有設(shè)備),整個(gè)系統(tǒng)無單點(diǎn)故障。 以上這些還是比較粗的幾條。
有了這樣的基礎(chǔ)設(shè)施保證,如果應(yīng)用系統(tǒng)本身支持不到相應(yīng)的幾個(gè)9, 那么整個(gè)業(yè)務(wù)系統(tǒng)就服從木桶原則,哪個(gè)服務(wù)可用性低就是哪個(gè)。 而動(dòng)不動(dòng)就上億用戶一起訪問的互聯(lián)網(wǎng)應(yīng)用來說,要做到 4 個(gè)或者5個(gè)9, 至少需要在幾個(gè)方面來考慮:架構(gòu)上的合理性和靈活性、整個(gè)系統(tǒng)成本的控制、運(yùn)維的方便和高效。
先說說成本,對(duì)于類似傳統(tǒng)的金融系統(tǒng)等而言,一般采用的是大塊頭的機(jī)器,因?yàn)槠浞⻊?wù)規(guī)模相對(duì)可控,譬如同時(shí)進(jìn)行存錢、取錢轉(zhuǎn)賬的用戶也就說那么萬級(jí)別。 但是對(duì)于互聯(lián)網(wǎng)系統(tǒng)而言,如果也采用大塊頭的機(jī)器,那么整個(gè)系統(tǒng)的花費(fèi)將是天文數(shù)字。所以除了特別關(guān)鍵的數(shù)據(jù)會(huì)采用大塊頭機(jī)器來處理,一般都買的是普通的商業(yè)計(jì)算機(jī)(小幾萬一個(gè)), 隨著用戶規(guī)模的增加不斷買新的機(jī)器進(jìn)行擴(kuò)充,這本身也符合發(fā)展規(guī)律。 但是一般的商用機(jī)器故障率還是相當(dāng)高的。你如果買過家用電腦,估計(jì)也經(jīng)常碰到機(jī)器開不起來的問題吧。 那么怎么樣在一堆機(jī)器里面的幾個(gè)機(jī)器壞了的情況下,系統(tǒng)還能正常工作呢,這就要求在應(yīng)用設(shè)計(jì)的時(shí)候能采用集群技術(shù),自動(dòng)進(jìn)行故障轉(zhuǎn)移和容錯(cuò)。 這就要求在架構(gòu)上要能考慮到這些因素。
然后我們?cè)賮砜,你如果所有的機(jī)器放在一個(gè)地方,即使能夠在一個(gè)機(jī)房放得下, 在地大物博的中國,從北京來訪問在杭州的服務(wù)器,如果是跨運(yùn)營商的網(wǎng)絡(luò)之間來訪問,估計(jì)比坐飛機(jī)快不了多少。 這樣的速度顯然不符合好的體驗(yàn)這條金律。 而且把所有機(jī)器放在一個(gè)地方,萬一這個(gè)地方出了什么問題,豈不是全完蛋了! 所以不能把雞蛋放在一個(gè)籃子里面,就需要根據(jù)用戶的分布情況在不同的城市、同一城市的不同區(qū)域來建設(shè)業(yè)務(wù)系統(tǒng)。但是在邏輯上, 不同城市的系統(tǒng)應(yīng)該又是同一個(gè)系統(tǒng)的,否則我在杭州加了一個(gè)在北京的朋友,如果過兩天看不到了,誰還用啊。
這里又有一些問題需要解決,譬如就在某一天某個(gè)城市的開挖下水道,把光纖給挖斷了, 導(dǎo)致訪問到這個(gè)城市的系統(tǒng)無法使用了,那怎么辦呢? 把這些用戶分流到別的城市的系統(tǒng)上去不就行了? 是的,理論上是可以的。 但是就相當(dāng)于如果一個(gè)城市被臺(tái)風(fēng)影響,需要把全部居民轉(zhuǎn)移到另外一個(gè)城市或者幾個(gè)城市里一樣,轉(zhuǎn)移到哪個(gè)城市、接收的城市是否能容納這些新增加的居民,這些居民的銀行存款等數(shù)據(jù)是否也能保證到了新城市后還能保持可用?在實(shí)在萬不得已的情況下,有一部分居民可能無法轉(zhuǎn)移。大規(guī)模互聯(lián)網(wǎng)系統(tǒng)在故障時(shí)的處理思路也大致如此。 首先需要規(guī)劃哪個(gè)城市給哪些用戶服務(wù),容量是多少,如果要接收別的城市的居民,那么還需要留多少容量,接收哪個(gè)城市來的用戶,事先要把這些用戶的信息能同步過來保存著等等。 即便如此在規(guī)劃無法做到十分完善的情況下,部分用戶可以繼續(xù)服務(wù),部分用戶只能降級(jí)服務(wù)甚至拒絕服務(wù),這也是為了保障整個(gè)系統(tǒng)能盡可能提供有限服務(wù)。
還有一個(gè)就是運(yùn)維的高效性, 在故障出現(xiàn)后或者出現(xiàn)之前就能及時(shí)啟動(dòng)合理的應(yīng)急措施,進(jìn)行用戶的分流,甚至對(duì)部分用戶進(jìn)行限流等。
如果在有些地方考慮不周,譬如我之前所在一家知名 IM 企業(yè),由于地震導(dǎo)致海底光纜故障,很大部分的用戶無法通過原路徑訪問系統(tǒng),系統(tǒng)本身無法在中國提供應(yīng)用層面的路由選擇;只能依賴運(yùn)營商來調(diào)整路由,這就在時(shí)間上大大超出可用性承諾的時(shí)間,無論最終是誰的原因, 最終導(dǎo)致用戶大量流失。 也碰到過由于沒有對(duì)部分用戶降級(jí)服務(wù)或者延遲服務(wù),而導(dǎo)致全部用戶不斷進(jìn)行服務(wù)恢復(fù)嘗試,形成浪涌和雪崩,導(dǎo)致整個(gè)服務(wù)最終拒絕服務(wù)(Deny of Service).
這些對(duì)于目前我們自己擁有上千萬并發(fā)的個(gè)推系統(tǒng)而言,也都是一直在完善的方面。
對(duì)于騰訊而言,這十幾年來對(duì)于幾億 QQ 用戶的服務(wù),積累了大量的有價(jià)值的經(jīng)驗(yàn). 微信出現(xiàn)這樣的情況,應(yīng)該說還是不多見的, 可能也說明在騰訊內(nèi)部的資源分配還存在一定不均衡。 不過相信他們可以很快進(jìn)行調(diào)整和完善,當(dāng)然在這背后也意味著他們巨大的努力和付出。