產(chǎn)品經(jīng)理需要了解的技術(shù)知識(shí):后臺(tái)宕機(jī)
產(chǎn)品的數(shù)據(jù)量一旦飛速的起來(lái),宕機(jī)就變成了分分鐘的事情。作為一個(gè)成熟而優(yōu)秀的產(chǎn)品經(jīng)理,你要做的就是先理解后臺(tái)邏輯,在做產(chǎn)品規(guī)劃的時(shí)候就考慮到一切可能的風(fēng)險(xiǎn)。本文講述了后臺(tái)宕機(jī)的原因、機(jī)制和解決之法,希望加深產(chǎn)品經(jīng)理對(duì)后臺(tái)宕機(jī)的理解,從而控制風(fēng)險(xiǎn)。
世界上最痛苦的事情不是產(chǎn)品流量沒(méi)起來(lái),而是流量上來(lái)了服務(wù)后臺(tái)卻掛了;世界上最痛苦的事情不是版本沒(méi)有如期上線,而是上線后程序員被祭了天。
但凡一款爆發(fā)式增長(zhǎng)的產(chǎn)品,幾乎都在后臺(tái)服務(wù)上折過(guò)腰,一般公司的操作方法:殺一個(gè)CTO祭天。但是,祭天有用嗎?這事兒就真的和產(chǎn)品經(jīng)理一點(diǎn)關(guān)系都沒(méi)有嗎?
今天麗莎阿姨就和你一起來(lái)聊聊后臺(tái)服務(wù)的那些事兒。聽(tīng)完后,希望你能理解程序員小哥,與他在同一認(rèn)知維度上思考,更關(guān)鍵的是也許你的一個(gè)小小舉措就能拯救一條猿命啊。
俗話說(shuō)得好,程序員有三難:
- 安卓:折疊、挖孔、齊劉海
- 蘋(píng)果:證書(shū)、上架、熱更新
- 前端開(kāi)發(fā):IE 六、七、八、九、十
- 后端開(kāi)發(fā):并發(fā)、寫(xiě)庫(kù)、做運(yùn)維
相比于其他,后端開(kāi)發(fā)的最大難度就是需要在有限的資源上對(duì)海量的數(shù)據(jù)做高效地處理。
怎么理解這句話呢?
- 有限的資源:例如當(dāng)前一個(gè)很厲害的 88 核/710GB 的后臺(tái)服務(wù)器,其實(shí)也就是宇宙第一強(qiáng)手機(jī) HUAWEI P40Pro(8 核/8G)的十倍左右。
- 海量的數(shù)據(jù):就我們產(chǎn)品而言,隨便挑一個(gè)數(shù)據(jù)庫(kù)都已經(jīng)有好幾 T 的大小。
- 高效地處理:后臺(tái)處理一慢,用戶(hù)體驗(yàn)就變的很糟糕,絲毫不敢懈怠。
所以,產(chǎn)品的數(shù)據(jù)量一旦飛速的起來(lái),宕機(jī)就變成了分分鐘的事情。
一個(gè)正常的猿外人,首先的思考就是:為啥不擴(kuò)容?不就是錢(qián)能解決問(wèn)題的嗎?
一、擴(kuò)容能解決宕機(jī)的問(wèn)題嗎?
1. 不是所有的資源都能簡(jiǎn)單的擴(kuò)容
12306 網(wǎng)站夠有錢(qián)吧,但是上線當(dāng)初就是瘋狂的崩啊,所以花錢(qián)并不能直接解決問(wèn)題。那么為啥不能簡(jiǎn)單橫向擴(kuò)容呢?
原因很簡(jiǎn)單:如果系統(tǒng)用到了一些有單點(diǎn)限制的資源,那其他系統(tǒng)再怎么擴(kuò)容也沒(méi)用。哪些是常見(jiàn)的單點(diǎn)資源呢?一般是數(shù)據(jù)庫(kù)、緩存、核心依賴(lài)的第三方服務(wù)等等。
2. 你永遠(yuǎn)不知道宕機(jī)和出軌哪一個(gè)先來(lái)
如上圖所示,隨著用戶(hù)量的增長(zhǎng)服務(wù)器的費(fèi)用也會(huì)水漲船高,但是用戶(hù)量的增長(zhǎng)很多時(shí)候要聽(tīng)天命。就像微博的突發(fā)事件,事情來(lái)了用戶(hù)暴漲XXXX萬(wàn),事情過(guò)后一片唏噓。
不擴(kuò)容不是人,擴(kuò)完容人散了,你就是豬。所以,對(duì)于產(chǎn)品經(jīng)理們來(lái)說(shuō),能夠非常精準(zhǔn)的預(yù)測(cè)到即將到來(lái)的流量就變的尤為重要。數(shù)據(jù)監(jiān)控,模型推演,歷史事件對(duì)比分析都是非常有效的方式。
這個(gè)時(shí)候,猿外人估計(jì)也會(huì)想到,為什么程序猿不進(jìn)行動(dòng)態(tài)的縮擴(kuò)容呢?
麗莎阿姨舉一個(gè)非常形象的例子:把后臺(tái)服務(wù)當(dāng)做一個(gè)奶茶店,假設(shè)一個(gè)營(yíng)業(yè)員小哥正常 1 分鐘處理一個(gè)用戶(hù),以下是可能會(huì)遇到的一些情況:
- 特殊工藝的奶茶:制作工藝非常復(fù)雜,做一杯要 5min,那這個(gè)營(yíng)業(yè)員這 5 分鐘暫時(shí)不能接客;
- 水龍頭流的很慢:每次接杯水都要好久,處理一個(gè)用戶(hù)的時(shí)間自然要變得很長(zhǎng);
- 還有一批混混:不知道被誰(shuí)雇傭過(guò)來(lái)的,過(guò)來(lái)排隊(duì)但又不買(mǎi);
這些問(wèn)題,都是后臺(tái)開(kāi)發(fā)的過(guò)程中會(huì)遇到的實(shí)際問(wèn)題,要處理起來(lái)每一個(gè)都非常棘手,并非雇傭和解雇幾個(gè)小哥就能解決的。
二、后臺(tái)服務(wù)為什么會(huì)掛?
常見(jiàn)的原因有兩個(gè):
- 單點(diǎn)系統(tǒng)可能會(huì)掛或者處理能力有限,典型:數(shù)據(jù)庫(kù)、Redis 緩存(10W qps)
- 第三方依賴(lài)可能會(huì)故障,包括核心依賴(lài)、非核心依賴(lài)
后臺(tái)程序員怎么做能讓服務(wù)能更穩(wěn)一點(diǎn)?
1. 拆
拆是一個(gè)種常見(jiàn)的方法,常見(jiàn)的會(huì)根據(jù)伸縮立方和微服務(wù)做下面這些拆分。
水平拆分
這種方式比較常見(jiàn),可以認(rèn)為是簡(jiǎn)單的水平擴(kuò)容,簡(jiǎn)單來(lái)說(shuō)就是一臺(tái)不行,多跑一臺(tái)扛著。
功能性拆分
這種方案是根據(jù)功能模塊的不同,進(jìn)行拆分后臺(tái)服務(wù),不把雞蛋放在一個(gè)籃子里。如果有一個(gè)服務(wù)故障,不影響其它服務(wù)的運(yùn)行。
數(shù)據(jù)拆分
前面有提到,數(shù)據(jù)庫(kù)經(jīng)常會(huì)成為單點(diǎn)的瓶頸。一般在功能性拆分的同時(shí),我們也會(huì)做數(shù)據(jù)的拆分,不讓一份數(shù)據(jù)變得超級(jí)大。
2. 尋找更強(qiáng)的單點(diǎn)
如果單點(diǎn)暫時(shí)有瓶頸,那可以考慮:是不是有功能一樣,但是性能更強(qiáng)的單點(diǎn)可以替代呢?
常見(jiàn)的方式是換組件,自己的不行換云服務(wù)的,單機(jī)版不行換集群版本。
比如對(duì)于數(shù)據(jù)庫(kù),阿里云上的 PolarDb 號(hào)稱(chēng)比傳統(tǒng) MySQL 性能提升 6 倍左右。
3. 犧牲時(shí)效性
既然數(shù)據(jù)庫(kù)寫(xiě)的單點(diǎn)很難解決,就從讀取上想辦法。這就像,老板太忙,就請(qǐng)一個(gè)秘書(shū),雖然消息傳遞有一些時(shí)延差,但是可以分擔(dān)老板的精力,一個(gè)秘書(shū)忙不過(guò)來(lái)還可以再多請(qǐng)幾個(gè)。
如下圖,一個(gè)家校溝通的產(chǎn)品,老師發(fā)布作業(yè)這個(gè)場(chǎng)景就可以犧牲掉一部分的時(shí)效性。
4. 讓單個(gè)請(qǐng)求處理更快
慢請(qǐng)求是后臺(tái)永遠(yuǎn)的噩夢(mèng),一旦有大量請(qǐng)求處理很慢,就非常危險(xiǎn)了,所以要程序員小哥在開(kāi)發(fā)的過(guò)程中,經(jīng)常做重構(gòu)、優(yōu)化、做架構(gòu)演進(jìn),目的就是讓請(qǐng)求處理得更快。
5. 提前計(jì)算好,不要等用戶(hù)來(lái)的時(shí)候再計(jì)算
對(duì)于一個(gè)業(yè)務(wù)來(lái)說(shuō),會(huì)存在一些數(shù)據(jù)統(tǒng)計(jì)相關(guān)的服務(wù),如果按照來(lái)一個(gè)用戶(hù)計(jì)算一次的方式,服務(wù)的質(zhì)量和數(shù)據(jù)庫(kù)的壓力都會(huì)非常大。
最好的方式就是在凌晨時(shí)把能計(jì)算的數(shù)據(jù)都計(jì)算好,等用戶(hù)來(lái)的時(shí)候,數(shù)據(jù)已經(jīng) ready,一個(gè)簡(jiǎn)單的讀取就可以拿到他要的結(jié)果。
但是,如果這些都做了,服務(wù)還是要崩,我們能怎么辦?
三、終極大招:有損服務(wù)與降級(jí)
我們?cè)诋a(chǎn)品設(shè)計(jì)和后臺(tái)開(kāi)發(fā)的時(shí)候,需要清楚你的系統(tǒng)「強(qiáng)依賴(lài)」和「弱依賴(lài)」是什么。
- 用戶(hù)沒(méi)感覺(jué)是弱依賴(lài)
- 用戶(hù)有感覺(jué)是強(qiáng)依賴(lài)
有了上面這些概念以后,就可以來(lái)做一些對(duì)應(yīng)的設(shè)計(jì):
- 犧牲用戶(hù)體驗(yàn):用靜態(tài)化數(shù)據(jù)代替「千人千面」的動(dòng)態(tài)數(shù)據(jù);放緩流量進(jìn)入的速率,增加驗(yàn)證碼機(jī)制;簡(jiǎn)單粗暴的,直接掛一個(gè)頁(yè)面顯示「XX 功能在 XX 時(shí)間內(nèi)暫時(shí)關(guān)閉」
- 犧牲功能完整性:有一些功能是「防御性」的,如果愿意冒險(xiǎn)“裸奔”一段時(shí)間也會(huì)帶來(lái)可觀的資源節(jié)約;臨時(shí)關(guān)閉「風(fēng)控」;取消部分「條件是否滿(mǎn)足」的判斷
- 犧牲時(shí)效性:將一些原本就是異步進(jìn)行的操作,處理效率放緩,甚至?xí)壕徱欢螘r(shí)間。如,送積分、送券等等
每個(gè)產(chǎn)品的后臺(tái)開(kāi)發(fā)都是一個(gè)非常復(fù)雜的系統(tǒng)工程。服務(wù)器掛了,拿程序員祭天是一點(diǎn)作用都沒(méi)有的。
作為一個(gè)成熟而優(yōu)秀的產(chǎn)品經(jīng)理,你要做的就是先理解后臺(tái)邏輯,在做產(chǎn)品規(guī)劃的時(shí)候就考慮到一切可能的風(fēng)險(xiǎn)。然后,就算是后臺(tái)掛了,也能從上文中提到的思路與后臺(tái)小哥一起來(lái)思考解決問(wèn)題。
做后臺(tái)很苦,請(qǐng)善待搬磚民工。文中的后臺(tái)相關(guān)技術(shù)術(shù)語(yǔ)如果有描述錯(cuò)誤的之處,還請(qǐng)各位在評(píng)論區(qū)指出斧正,感謝。
#專(zhuān)欄作家#
Lisa Deng,微信公眾號(hào):麗莎D的產(chǎn)品手記,人人都是產(chǎn)品經(jīng)理專(zhuān)欄作家。12年資深產(chǎn)品人,某教育公司產(chǎn)品總監(jiān),關(guān)注在線教育、工具產(chǎn)品、AI應(yīng)用等領(lǐng)域,擅長(zhǎng)總結(jié)產(chǎn)品的基礎(chǔ)方法論。
本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)作者許可,禁止轉(zhuǎn)載。
題圖來(lái)自Unsplash,基于CC0協(xié)議
學(xué)到了
Lisa自己寫(xiě)的嗎,有點(diǎn)厲害啊,我前端程序出生的表示都沒(méi)有這些領(lǐng)悟
初級(jí)產(chǎn)品經(jīng)理表示看不懂,請(qǐng)問(wèn)怎么提高這方面的能力
后臺(tái)路過(guò)看到我在看片文章流下了感動(dòng)的眼淚
哈哈哈哈哈
我看到了你在流眼淚
我看到了你看到她在流淚