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