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