后臺(tái)開(kāi)發(fā)作為互聯(lián)網(wǎng)技術(shù)的掌上明珠,一直都是程序員們追逐的高峰,本文為大家介紹后端技術(shù)大全。
原文:http://t.cn/AiQWteI2
系統(tǒng)開(kāi)發(fā)
1. 高內(nèi)聚/低耦合
高內(nèi)聚指一個(gè)軟件模塊是由相關(guān)性很強(qiáng)的代碼組成,只負(fù)責(zé)一項(xiàng)任務(wù),也就是常說(shuō)的單一責(zé)任原則。模塊的內(nèi)聚反映模塊內(nèi)部聯(lián)系的緊密程度。
模塊之間聯(lián)系越緊密,其耦合性就越強(qiáng),模塊的獨(dú)立性則越差。模塊間耦合高低取決于模塊間接口的復(fù)雜性、調(diào)用的方式及傳遞的信息。一個(gè)完整的系統(tǒng),模塊與模塊之間,盡可能的使其獨(dú)立存在。通常程序結(jié)構(gòu)中各模塊的內(nèi)聚程度越高,模塊間的耦合程度就越低。
2. 過(guò)度設(shè)計(jì)
過(guò)度設(shè)計(jì)就是進(jìn)行了過(guò)多的面向未來(lái)的設(shè)計(jì)或者說(shuō)把相對(duì)簡(jiǎn)單的事情想復(fù)雜了,過(guò)度追求模塊化、可擴(kuò)展性、設(shè)計(jì)模式等,為系統(tǒng)增加了不必要的復(fù)雜度。
3. 過(guò)早優(yōu)化
過(guò)早指的不是在開(kāi)發(fā)過(guò)程的早期,而是在還沒(méi)弄清楚需求未來(lái)的變化的走向的時(shí)候。你的優(yōu)化不僅可能導(dǎo)致你無(wú)法很好地實(shí)現(xiàn)新的需求,而且你對(duì)優(yōu)化的預(yù)期的猜測(cè)有可能還是錯(cuò)的,導(dǎo)致實(shí)際上你除了把代碼變復(fù)雜以外什么都沒(méi)得到。
正確的方法是,先有質(zhì)量地實(shí)現(xiàn)你的需求,寫夠testcase,然后做profile去找到性能的瓶頸,這個(gè)時(shí)候才做優(yōu)化。
4. 重構(gòu) (Refactoring)
重構(gòu)(Refactoring)就是通過(guò)調(diào)整程序代碼改善軟件的質(zhì)量、性能,使其程序的設(shè)計(jì)模式和架構(gòu)更趨合理,提高軟件的擴(kuò)展性和維護(hù)性。
5. 破窗效應(yīng)
又稱破窗理論,破窗效應(yīng)(Broken windows theory)是犯罪學(xué)的一個(gè)理論。此理論認(rèn)為環(huán)境中的不良現(xiàn)象如果被放任存在,會(huì)誘使人們仿效,甚至變本加厲。一幢有少許破窗的建筑為例,如果那些窗不被修理好,可能將會(huì)有破壞者破壞更多的窗戶。最終他們甚至?xí)J入建筑內(nèi),如果發(fā)現(xiàn)無(wú)人居住,也許就在那里定居或者縱火。
應(yīng)用在軟件工程上就是,一定不能讓系統(tǒng)代碼或者架構(gòu)設(shè)計(jì)的隱患有冒頭的機(jī)會(huì),否則隨著時(shí)間的推移,隱患會(huì)越來(lái)越重。反之,一個(gè)本身優(yōu)質(zhì)的系統(tǒng),會(huì)讓人不由自主的寫出優(yōu)質(zhì)的代碼。
6. 互不信任原則
指在程序運(yùn)行上下游的整個(gè)鏈路中,每個(gè)點(diǎn)都是不能保證絕對(duì)可靠的,任何一個(gè)點(diǎn)都可能隨時(shí)發(fā)生故障或者不可預(yù)知的行為,包括機(jī)器網(wǎng)絡(luò)、服務(wù)本身、依賴環(huán)境、輸入和請(qǐng)求等,因此要處處設(shè)防。
7. 持久化 (Persistence)
持久化是將程序數(shù)據(jù)在臨時(shí)狀態(tài)和持久狀態(tài)間轉(zhuǎn)換的機(jī)制。通俗的講,就是臨時(shí)數(shù)據(jù)(比如內(nèi)存中的數(shù)據(jù),是不能永久保存的)持久化為持久數(shù)據(jù)(比如持久化至數(shù)據(jù)庫(kù)或者本地磁盤中,能夠長(zhǎng)久保存)。
8. 臨界區(qū)
臨界區(qū)用來(lái)表示一種公共資源或者說(shuō)是共享數(shù)據(jù),可以被多個(gè)線程使用,但是每一次,只能有一個(gè)線程使用它,一旦臨界區(qū)資源被占用,其他線程要想使用這個(gè)資源,就必須等待。
9. 阻塞/非阻塞
阻塞和非阻塞通常形容多線程間的相互影響。比如一個(gè)線程占用了臨界區(qū)資源,那么其它所有需要這個(gè)資源的線程就必須在這個(gè)臨界區(qū)中進(jìn)行等待,等待會(huì)導(dǎo)致線程掛起。這種情況就是阻塞。此時(shí),如果占用資源的線程一直不愿意釋放資源,那么其它所有阻塞在這個(gè)臨界區(qū)上的線程都不能工作。而非阻塞允許多個(gè)線程同時(shí)進(jìn)入臨界區(qū)。
10. 同步/異步
通常同步和異步是指函數(shù)/方法調(diào)用方面。
同步就是在發(fā)出一個(gè)函數(shù)調(diào)用時(shí),在沒(méi)有得到結(jié)果之前,該調(diào)用就不返回。異步調(diào)用會(huì)瞬間返回,但是異步調(diào)用瞬間返回并不代表你的任務(wù)就完成了,他會(huì)在后臺(tái)起個(gè)線程繼續(xù)進(jìn)行任務(wù),等任務(wù)執(zhí)行完畢后通過(guò)回調(diào)callback或其他方式通知調(diào)用方。
11. 并發(fā)/并行
- 并行(parallel)指在同一時(shí)刻,有多條指令在多個(gè)處理器上同時(shí)執(zhí)行。所以無(wú)論從微觀還是從宏觀來(lái)看,二者都是一起執(zhí)行的。
- 并發(fā)(concurrency)指在同一時(shí)刻只能有一條指令執(zhí)行,但多個(gè)進(jìn)程指令被快速的輪換執(zhí)行,使得在宏觀上具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果,但在微觀上并不是同時(shí)執(zhí)行的,只是把時(shí)間分成若干段,使多個(gè)進(jìn)程快速交替的執(zhí)行。
架構(gòu)設(shè)計(jì)
1. 高并發(fā) (High Concurrency)
由于分布式系統(tǒng)的問(wèn)世,高并發(fā)(High Concurrency)通常是指通過(guò)設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并行處理很多請(qǐng)求。通俗來(lái)講,高并發(fā)是指在同一個(gè)時(shí)間點(diǎn),有很多用戶同時(shí)的訪問(wèn)同一 API 接口或者 Url 地址。它經(jīng)常會(huì)發(fā)生在有大活躍用戶量,用戶高聚集的業(yè)務(wù)場(chǎng)景中。
2. 高可用 (High Availability)
高可用HA(High Availability)是分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,它通常是指,一個(gè)系統(tǒng)經(jīng)過(guò)專門的設(shè)計(jì),以減少停工時(shí)間,而保持其服務(wù)的高度可用性。
3. 讀寫分離
為了確保數(shù)據(jù)庫(kù)產(chǎn)品的穩(wěn)定性,很多數(shù)據(jù)庫(kù)擁有雙機(jī)熱備功能。也就是,第一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,是對(duì)外提供增刪改業(yè)務(wù)的生產(chǎn)服務(wù)器;第二臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,主要進(jìn)行讀的操作。
4. 冷備/熱備
- 冷備:兩個(gè)服務(wù)器,一臺(tái)運(yùn)行,一臺(tái)不運(yùn)行做為備份。這樣一旦運(yùn)行的服務(wù)器宕機(jī),就把備份的服務(wù)器運(yùn)行起來(lái)。冷備的方案比較容易實(shí)現(xiàn),但冷備的缺點(diǎn)是主機(jī)出現(xiàn)故障時(shí)備機(jī)不會(huì)自動(dòng)接管,需要主動(dòng)切換服務(wù)。
- 熱備:即是通常所說(shuō)的active/standby方式,服務(wù)器數(shù)據(jù)包括數(shù)據(jù)庫(kù)數(shù)據(jù)同時(shí)往兩臺(tái)或多臺(tái)服務(wù)器寫。當(dāng)active服務(wù)器出現(xiàn)故障的時(shí)候,通過(guò)軟件診測(cè)(一般是通過(guò)心跳診斷)將standby機(jī)器激活,保證應(yīng)用在短時(shí)間內(nèi)完全恢復(fù)正常使用。當(dāng)一臺(tái)服務(wù)器宕機(jī)后,自動(dòng)切換到另一臺(tái)備用機(jī)使用。
5. 異地多活
異地多活一般是指在不同城市建立獨(dú)立的數(shù)據(jù)中心,“活”是相對(duì)于冷備份而言的,冷備份是備份全量數(shù)據(jù),平時(shí)不支撐業(yè)務(wù)需求,只有在主機(jī)房出現(xiàn)故障的時(shí)候才會(huì)切換到備用機(jī)房,而多活,是指這些機(jī)房在日常的業(yè)務(wù)中也需要走流量,做業(yè)務(wù)支撐。
6. 負(fù)載均衡 (Load Balance)
負(fù)載均衡,是對(duì)多臺(tái)服務(wù)器進(jìn)行流量分發(fā)的負(fù)載均衡服務(wù)??稍诙鄠€(gè)實(shí)例間自動(dòng)分配應(yīng)用程序的對(duì)外服務(wù)能力,通過(guò)消除單點(diǎn)故障提升應(yīng)用系統(tǒng)的可用性,讓您實(shí)現(xiàn)更高水平的應(yīng)用程序容錯(cuò)能力,從而無(wú)縫提供分配應(yīng)用程序流量所需的負(fù)載均衡容量,為您提供高效、穩(wěn)定、安全的服務(wù)。
7. 動(dòng)靜分離
動(dòng)靜分離是指在web服務(wù)器架構(gòu)中,將靜態(tài)頁(yè)面與動(dòng)態(tài)頁(yè)面或者靜態(tài)內(nèi)容接口和動(dòng)態(tài)內(nèi)容接口分開(kāi)不同系統(tǒng)訪問(wèn)的架構(gòu)設(shè)計(jì)方法,進(jìn)而提升整個(gè)服務(wù)訪問(wèn)性能和可維護(hù)性。
8. 集群
單臺(tái)服務(wù)器的并發(fā)承載能力總是有限的,當(dāng)單臺(tái)服務(wù)器處理能力達(dá)到性能瓶頸的時(shí),將多臺(tái)服務(wù)器組合起來(lái)提供服務(wù),這種組合方式稱之為集群,集群中每臺(tái)服務(wù)器就叫做這個(gè)集群的一個(gè)“節(jié)點(diǎn)”,每個(gè)節(jié)點(diǎn)都能提供相同的服務(wù),從而成倍的提升整個(gè)系統(tǒng)的并發(fā)處理能力。
9. 分布式
分布式系統(tǒng)就是將一個(gè)完整的系統(tǒng)按照業(yè)務(wù)功能拆分成很多獨(dú)立的子系統(tǒng),每個(gè)子系統(tǒng)就被稱為“服務(wù)”,分布式系統(tǒng)將請(qǐng)求分揀和分發(fā)到不同的子系統(tǒng),讓不同的服務(wù)來(lái)處理不同的請(qǐng)求。在分布式系統(tǒng)中,子系統(tǒng)獨(dú)立運(yùn)行,它們之間通過(guò)網(wǎng)絡(luò)通信連接起來(lái)實(shí)現(xiàn)數(shù)據(jù)互通和組合服務(wù)。
10. CAP理論
CAP理論,指的是在一個(gè)分布式系統(tǒng)中,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分區(qū)容錯(cuò)性),不能同時(shí)成立。
- 一致性:它要求在同一時(shí)刻點(diǎn),分布式系統(tǒng)中的所有數(shù)據(jù)備份都相同或者都處于同一狀態(tài)。
- 可用性:在系統(tǒng)集群的一部分節(jié)點(diǎn)宕機(jī)后,系統(tǒng)依然能夠正確的響應(yīng)用戶的請(qǐng)求。
- 分區(qū)容錯(cuò)性:系統(tǒng)能夠容忍節(jié)點(diǎn)之間的網(wǎng)絡(luò)通信的故障。
簡(jiǎn)單的來(lái)說(shuō),在一個(gè)分布式系統(tǒng)中,最多能支持上面的兩種屬性。但顯然既然是分布式注定我們是必然要進(jìn)行分區(qū),既然分區(qū),我們就無(wú)法百分百避免分區(qū)的錯(cuò)誤。因此,我們只能在一致性和可用性去作出選擇。
在分布式系統(tǒng)中,我們往往追求的是可用性,它的重要性比一致性要高,那么如何實(shí)現(xiàn)高可用,這里又有一個(gè)理論,就是 BASE 理論,它給 CAP 理論做了進(jìn)一步的擴(kuò)充。
11. BASE理論
BASE 理論指出:
- Basically Available(基本可用)
- Soft state(軟狀態(tài))
- Eventually consistent(最終一致性)
BASE 理論是對(duì) CAP 中的一致性和可用性進(jìn)行一個(gè)權(quán)衡的結(jié)果,理論的核心思想就是:我們無(wú)法做到強(qiáng)一致,但每個(gè)應(yīng)用都可以根據(jù)自身的業(yè)務(wù)特點(diǎn),采用適當(dāng)?shù)姆绞絹?lái)使系統(tǒng)達(dá)到最終一致性。
12. 水平擴(kuò)展/垂直擴(kuò)展
- 水平擴(kuò)展 Scale Out通過(guò)增加更多的服務(wù)器或者程序?qū)嵗齺?lái)分散負(fù)載,從而提升存儲(chǔ)能力和計(jì)算能力。
- 垂直擴(kuò)展 Scale Up 提升單機(jī)處理能力。
垂直擴(kuò)展的方式又有兩種:
(1)增強(qiáng)單機(jī)硬件性能,例如:增加CPU核數(shù)如32核,升級(jí)更好的網(wǎng)卡如萬(wàn)兆,升級(jí)更好的硬盤如SSD,擴(kuò)充硬盤容量如2T,擴(kuò)充系統(tǒng)內(nèi)存如128G;
(2)提升單機(jī)軟件或者架構(gòu)性能,例如:使用Cache來(lái)減少IO次數(shù),使用異步來(lái)增加單服務(wù)吞吐量,使用無(wú)鎖數(shù)據(jù)結(jié)構(gòu)來(lái)減少響應(yīng)時(shí)間;
13. 平行擴(kuò)容
與水平擴(kuò)展類似。集群服務(wù)器中的節(jié)點(diǎn)均為平行對(duì)等節(jié)點(diǎn),當(dāng)需要擴(kuò)容時(shí),可以通過(guò)添加更多節(jié)點(diǎn)以提高集群的服務(wù)能力。一般來(lái)說(shuō)服務(wù)器中關(guān)鍵路徑(如服務(wù)器中的登錄、支付、核心業(yè)務(wù)邏輯等)都需要支持運(yùn)行時(shí)動(dòng)態(tài)平行擴(kuò)容。
14. 彈性擴(kuò)容
指對(duì)部署的集群進(jìn)行動(dòng)態(tài)在線擴(kuò)容。彈性擴(kuò)容系統(tǒng)可以根據(jù)實(shí)際業(yè)務(wù)環(huán)境按照一定策略自動(dòng)地添加更多的節(jié)點(diǎn)(包括存儲(chǔ)節(jié)點(diǎn)、計(jì)算節(jié)點(diǎn)、網(wǎng)絡(luò)節(jié)點(diǎn))來(lái)增加系統(tǒng)容量、提高系統(tǒng)性能或者增強(qiáng)系統(tǒng)可靠性,或者同時(shí)完成這三個(gè)目標(biāo)。
15. 狀態(tài)同步/幀同步
- 狀態(tài)同步:狀態(tài)同步是指服務(wù)器負(fù)責(zé)計(jì)算全部的游戲邏輯,并且廣播這些計(jì)算的結(jié)果,客戶端僅僅負(fù)責(zé)發(fā)送玩家的操作,以及表現(xiàn)收到的游戲結(jié)果。
特征:狀態(tài)同步安全性高,邏輯更新方便,斷線重連快,但是開(kāi)發(fā)效率較低,網(wǎng)絡(luò)流量隨游戲復(fù)雜度增加,服務(wù)器需要承載更大壓力。
- 幀同步:服務(wù)端只轉(zhuǎn)發(fā)消息,不做任何邏輯處理,各客戶端每秒幀數(shù)一致,在每一幀都處理同樣的輸入數(shù)據(jù)。
特征:幀同步需要保證系統(tǒng)在相同的輸入下,要有相同的輸出。幀同步開(kāi)發(fā)效率高,流量消耗低而且穩(wěn)定,對(duì)服務(wù)器的壓力非常小。但是網(wǎng)絡(luò)要求高,斷線重連時(shí)間長(zhǎng),客戶端計(jì)算壓力大。
網(wǎng)絡(luò)通信
1. 連接池
預(yù)先建立一個(gè)連接緩沖池,并提供一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、安全的復(fù)用,避免了連接頻繁建立、關(guān)閉的開(kāi)銷。
2. 斷線重連
由于網(wǎng)絡(luò)波動(dòng)造成用戶間歇性的斷開(kāi)與服務(wù)器的連接,待網(wǎng)絡(luò)恢復(fù)之后服務(wù)器嘗試將用戶連接到上次斷開(kāi)時(shí)的狀態(tài)和數(shù)據(jù)。
3. 會(huì)話保持
會(huì)話保持是指在負(fù)載均衡器上的一種機(jī)制,可以識(shí)別客戶端與服務(wù)器之間交互過(guò)程的關(guān)連性,在作負(fù)載均衡的同時(shí)還保證一系列相關(guān)連的訪問(wèn)請(qǐng)求都會(huì)分配到一臺(tái)機(jī)器上。用人話來(lái)表述就是:在一次會(huì)話過(guò)程中發(fā)起的多個(gè)請(qǐng)求都會(huì)落到同一臺(tái)機(jī)器上。
4. 長(zhǎng)連接/短連接
通常是指TCP的長(zhǎng)連接和短連接。長(zhǎng)連接就是建立TCP連接后,一直保持這個(gè)連接,一般會(huì)中間彼此發(fā)送心跳來(lái)確認(rèn)對(duì)應(yīng)的存在,中間會(huì)做多次業(yè)務(wù)數(shù)據(jù)傳輸,一般不會(huì)主動(dòng)斷開(kāi)連接。短連接一般指建立連接后,執(zhí)行一次事務(wù)后(如:http請(qǐng)求),然后就關(guān)掉這個(gè)連接。
5. 流量控制/擁塞控制
- 流量控制防止發(fā)送方發(fā)的太快,耗盡接收方的資源,從而使接收方來(lái)不及處理。
- 擁塞控制防止發(fā)送方發(fā)的太快,使得網(wǎng)絡(luò)來(lái)不及處理產(chǎn)生擁塞,進(jìn)而引起這部分乃至整個(gè)網(wǎng)絡(luò)性能下降的現(xiàn)象,嚴(yán)重時(shí)甚至?xí)?dǎo)致網(wǎng)絡(luò)通信業(yè)務(wù)陷入停頓。
6. 驚群效應(yīng)
驚群效應(yīng)也有人叫做雷鳴群體效應(yīng),不過(guò)叫什么,簡(jiǎn)言之,驚群現(xiàn)象就是多進(jìn)程(多線程)在同時(shí)阻塞等待同一個(gè)事件的時(shí)候(休眠狀態(tài)),如果等待的這個(gè)事件發(fā)生,那么他就會(huì)喚醒等待的所有進(jìn)程(或者線程),但是最終卻只可能有一個(gè)進(jìn)程(線程)獲得這個(gè)時(shí)間的“控制權(quán)”,對(duì)該事件進(jìn)行處理,而其他進(jìn)程(線程)獲取“控制權(quán)”失敗,只能重新進(jìn)入休眠狀態(tài),這種現(xiàn)象和性能浪費(fèi)就叫做驚群。
7. NAT
NAT(Network Address Translation,網(wǎng)絡(luò)地址轉(zhuǎn)換),就是替換IP報(bào)文頭部的地址信息。NAT通常部署在一個(gè)組織的網(wǎng)絡(luò)出口位置,通過(guò)將內(nèi)部網(wǎng)絡(luò)IP地址替換為出口的IP地址提供公網(wǎng)可達(dá)性和上層協(xié)議的連接能力。
故障異常
1. 宕機(jī)
宕機(jī),一般情況下指的就是計(jì)算機(jī)主機(jī)出現(xiàn)意外故障而死機(jī)。其次,一些服務(wù)器例如數(shù)據(jù)庫(kù)死鎖也可以稱為宕機(jī),一些服務(wù)器的某些服務(wù)掛掉了,就可以這么說(shuō)。
2. coredump
當(dāng)程序出錯(cuò)而異常中斷時(shí),OS會(huì)把程序工作的當(dāng)前狀態(tài)存儲(chǔ)成一個(gè)coredunmp文件。通常情況下coredump文件包含了程序運(yùn)行時(shí)的內(nèi)存,寄存器狀態(tài),堆棧指針,內(nèi)存管理信息等。
3. 緩存穿透/擊穿/雪崩
- 緩存穿透:緩存穿透是指查詢一個(gè)一定不存在的數(shù)據(jù),由于緩存是不命中時(shí)需要從數(shù)據(jù)庫(kù)查詢,查不到數(shù)據(jù)則不寫入緩存,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到數(shù)據(jù)庫(kù)去查詢,進(jìn)而給數(shù)據(jù)庫(kù)帶來(lái)壓力。
- 緩存擊穿:緩存擊穿是指熱點(diǎn)key在某個(gè)時(shí)間點(diǎn)過(guò)期的時(shí)候,而恰好在這個(gè)時(shí)間點(diǎn)對(duì)這個(gè)Key有大量的并發(fā)請(qǐng)求過(guò)來(lái),從而大量的請(qǐng)求打到db。
- 緩存雪崩:緩存雪崩是指緩存中數(shù)據(jù)大批量到過(guò)期時(shí)間,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫(kù)壓力過(guò)大甚至down機(jī)。
- 與緩存擊穿不同的是:存擊穿是熱點(diǎn)key失效,緩存雪崩是大量的key同時(shí)失效。
4. 500/501/502/503/504/505
- 500 Internal Server Error:內(nèi)部服務(wù)錯(cuò)誤,一般是服務(wù)器遇到意外情況,而無(wú)法完成請(qǐng)求??赡茉? 1、程序錯(cuò)誤,例如:ASP或者PHP語(yǔ)法錯(cuò)誤;2、高并發(fā)導(dǎo)致,系統(tǒng)資源限制不能打開(kāi)過(guò)多的文件所致。
- 501Not implemented:服務(wù)器不理解或不支持請(qǐng)求的HTTP請(qǐng)求。
- 502Bad Gateway:WEB服務(wù)器故障,可能是由于程序進(jìn)程不夠,請(qǐng)求的php-fpm已經(jīng)執(zhí)行,但是由于某種原因而沒(méi)有執(zhí)行完畢,最終導(dǎo)致php-fpm進(jìn)程終止??赡茉颍?、Nginx服務(wù)器,php-cgi進(jìn)程數(shù)不夠用;2、PHP執(zhí)行時(shí)間過(guò)長(zhǎng);3、php-cgi進(jìn)程死掉;
- 503Service Unavailable:服務(wù)器目前無(wú)法使用。系統(tǒng)維護(hù)服務(wù)器暫時(shí)的無(wú)法處理客戶端的請(qǐng)求,這只是暫時(shí)狀態(tài)。可以聯(lián)系下服務(wù)器提供商。
- 504Gateway Timeout:服務(wù)器504錯(cuò)誤表示超時(shí),是指客戶端所發(fā)出的請(qǐng)求沒(méi)有到達(dá)網(wǎng)關(guān),請(qǐng)求沒(méi)有到可以執(zhí)行的php-fpm,一般是與nginx.conf的配置有關(guān)。
- 505HTTP Version Not Supported:服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本。(HTTP 版本不受支持)
除了500錯(cuò)誤可能是程序語(yǔ)言錯(cuò)誤,其余的報(bào)錯(cuò),都大概可以理解為服務(wù)器或者服務(wù)器配置出現(xiàn)問(wèn)題。
5. 內(nèi)存溢出/內(nèi)存泄漏
- 內(nèi)存溢出:內(nèi)存溢出(Out Of Memory)指程序申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存供申請(qǐng)者使用,或者說(shuō),給了你一塊存儲(chǔ)int類型數(shù)據(jù)的存儲(chǔ)空間,但是你卻存儲(chǔ)long類型的數(shù)據(jù),那么結(jié)果就是內(nèi)存不夠用,此時(shí)就會(huì)報(bào)錯(cuò)OOM,即所謂的內(nèi)存溢出。
- 內(nèi)存泄漏:內(nèi)存泄漏(Memory Leak)指程序中己動(dòng)態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無(wú)法釋放,造成系統(tǒng)內(nèi)存的浪費(fèi),導(dǎo)致程序運(yùn)行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果。
6. 句柄泄漏
句柄泄漏是進(jìn)程在調(diào)用系統(tǒng)文件之后,沒(méi)有釋放已經(jīng)打開(kāi)的文件句柄。一般句柄泄漏后的現(xiàn)象是,機(jī)器變慢,CPU飆升,出現(xiàn)句柄泄漏的cgi或server的CPU使用率增加。
7. 死鎖
死鎖是指兩個(gè)或兩個(gè)以上的線程在執(zhí)行過(guò)程中,由于競(jìng)爭(zhēng)資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無(wú)外力作用,它們都抑制處于阻塞狀態(tài)并無(wú)法進(jìn)行下去,此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖。
8. 軟中斷/硬中斷
- 硬中斷:我們通常所說(shuō)的中斷指的是硬中斷(hardirq)。 主要是用來(lái)通知操作系統(tǒng)系統(tǒng)外設(shè)狀態(tài)的變化。
- 軟中斷:1、通常是硬中斷服務(wù)程序?qū)?nèi)核的中斷;2、為了滿足實(shí)時(shí)系統(tǒng)的要求,中斷處理應(yīng)該是越快越好。
linux為了實(shí)現(xiàn)這個(gè)特點(diǎn),當(dāng)中斷發(fā)生的時(shí)候,硬中斷處理那些短時(shí)間就可以完成的工作,而將那些處理事件比較長(zhǎng)的工作,放到中斷之后來(lái)完成,也就是軟中斷(softirq)來(lái)完成。
9. 毛刺
在短暫的某一刻,服務(wù)器性能指標(biāo)(如流量、磁盤IO、CPU使用率等)遠(yuǎn)大于該時(shí)刻前后時(shí)間段。毛刺的出現(xiàn)代表這服務(wù)器資源利用不均勻,不充分,容易誘發(fā)其他更嚴(yán)重的問(wèn)題。
10. 重放攻擊
攻擊者發(fā)送一個(gè)目的主機(jī)已接收過(guò)的包,來(lái)達(dá)到欺騙系統(tǒng)的目的,主要用于身份認(rèn)證過(guò)程,破壞認(rèn)證的正確性。它是一種攻擊類型,這種攻擊會(huì)不斷惡意或欺詐性地重復(fù)一個(gè)有效的數(shù)據(jù)傳輸,重放攻擊可以由發(fā)起者,也可以由攔截并重發(fā)該數(shù)據(jù)的敵方進(jìn)行。攻擊者利用網(wǎng)絡(luò)監(jiān)聽(tīng)或者其他方式盜取認(rèn)證憑據(jù),之后再把它重新發(fā)給認(rèn)證服務(wù)器。
11. 網(wǎng)絡(luò)孤島
網(wǎng)絡(luò)孤島指集群環(huán)境中,部分機(jī)器與整個(gè)集群失去網(wǎng)絡(luò)連接,分裂為一個(gè)小集群并且發(fā)生數(shù)據(jù)不一致的狀況。
12. 數(shù)據(jù)傾斜
對(duì)于集群系統(tǒng),一般緩存是分布式的,即不同節(jié)點(diǎn)負(fù)責(zé)一定范圍的緩存數(shù)據(jù)。我們把緩存數(shù)據(jù)分散度不夠,導(dǎo)致大量的緩存數(shù)據(jù)集中到了一臺(tái)或者幾臺(tái)服務(wù)節(jié)點(diǎn)上,稱為數(shù)據(jù)傾斜。一般來(lái)說(shuō)數(shù)據(jù)傾斜是由于負(fù)載均衡實(shí)施的效果不好引起的。
13. 腦裂
腦裂是指在集群系統(tǒng)中,部分節(jié)點(diǎn)之間網(wǎng)絡(luò)不可達(dá)而引起的系統(tǒng)分裂,不同分裂的小集群會(huì)按照各自的狀態(tài)提供服務(wù),原本的集群會(huì)同時(shí)存在不一致的反應(yīng),造成節(jié)點(diǎn)之間互相爭(zhēng)搶資源,系統(tǒng)混亂,數(shù)據(jù)損壞。
監(jiān)控告警
1. 服務(wù)監(jiān)控
服務(wù)監(jiān)控主要目的在服務(wù)出現(xiàn)問(wèn)題或者快要出現(xiàn)問(wèn)題時(shí)能夠準(zhǔn)確快速地發(fā)現(xiàn)以減小影響范圍。服務(wù)監(jiān)控一般有多種手段,按層次可劃分為:
- 系統(tǒng)層(CPU、網(wǎng)絡(luò)狀態(tài)、IO、機(jī)器負(fù)載等)
- 應(yīng)用層(進(jìn)程狀態(tài)、錯(cuò)誤日志、吞吐量等)
- 業(yè)務(wù)層(服務(wù)/接口的錯(cuò)誤碼、響應(yīng)時(shí)間)
- 用戶層(用戶行為、輿情監(jiān)控、前端埋點(diǎn))
2. 全鏈路監(jiān)控
- 服務(wù)撥測(cè):服務(wù)撥測(cè)是探測(cè)服務(wù)(應(yīng)用)可用性的監(jiān)控方式,通過(guò)撥測(cè)節(jié)點(diǎn)對(duì)目標(biāo)服務(wù)進(jìn)行周期性探測(cè),主要通過(guò)可用性和響應(yīng)時(shí)間來(lái)度量,撥測(cè)節(jié)點(diǎn)通常有異地多個(gè)。
- 節(jié)點(diǎn)探測(cè):節(jié)點(diǎn)探測(cè)是用來(lái)發(fā)現(xiàn)和追蹤不同的機(jī)房(數(shù)據(jù)中心)節(jié)點(diǎn)之間網(wǎng)絡(luò)可用性和通暢性的監(jiān)控方式,主要通過(guò)響應(yīng)時(shí)間、丟包率、跳數(shù)來(lái)度量,探測(cè)方法一般是ping、mtr或其他私有協(xié)議。
- 告警過(guò)濾:對(duì)某些可預(yù)知的告警進(jìn)行過(guò)濾,不進(jìn)入告警統(tǒng)計(jì)的數(shù)據(jù),如少量爬蟲(chóng)訪問(wèn)導(dǎo)致的http響應(yīng)500錯(cuò)誤,業(yè)務(wù)系統(tǒng)自定義異常信息等。
- 告警去重:當(dāng)一個(gè)告警通知負(fù)責(zé)人后,在這個(gè)告警恢復(fù)之前,不會(huì)繼續(xù)收到相同的告警。
- 告警抑制:為了減少由于系統(tǒng)抖動(dòng)帶來(lái)的干擾,還需要實(shí)現(xiàn)抑制,例如服務(wù)器瞬間高負(fù)載,可能是正常的,只有持續(xù)一段時(shí)間的高負(fù)載才需要得到重視。
- 告警恢復(fù):開(kāi)發(fā)/運(yùn)維人員不僅需要收到告警通知,還需要收到故障消除告警恢復(fù)正常的通知。
- 告警合并:對(duì)同一時(shí)刻產(chǎn)生的多條相同告警進(jìn)行合并,如某個(gè)微服務(wù)集群同一時(shí)刻出現(xiàn)多個(gè)子服務(wù)負(fù)載過(guò)高的告警,需要合并成為一條告警。
- 告警收斂:有時(shí)某個(gè)告警產(chǎn)生時(shí),往往會(huì)伴隨著其它告警。這時(shí)可以只對(duì)根本原因產(chǎn)生告警,其它告警收斂為子告警一并發(fā)送通知。如云服務(wù)器出現(xiàn)CPU負(fù)載告警時(shí)往往伴隨其搭載的所有系統(tǒng)的可用性告警。
- 故障自愈:實(shí)時(shí)發(fā)現(xiàn)告警,預(yù)診斷分析,自動(dòng)恢復(fù)故障,并打通周邊系統(tǒng)實(shí)現(xiàn)整個(gè)流程的閉環(huán)。
服務(wù)治理
1. 微服務(wù)
微服務(wù)架構(gòu)是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間相互協(xié)調(diào)、互相配合,為用戶提供最終價(jià)值。每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)和服務(wù)之間采用輕量級(jí)的通信機(jī)制相互溝通(通常是基于HTTP的Restful API).每個(gè)服務(wù)都圍繞著具體的業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠被獨(dú)立的部署到生產(chǎn)環(huán)境、類生產(chǎn)環(huán)境等。
2. 服務(wù)發(fā)現(xiàn)
服務(wù)發(fā)現(xiàn)是指使用一個(gè)注冊(cè)中心來(lái)記錄分布式系統(tǒng)中的全部服務(wù)的信息,以便其他服務(wù)能夠快速的找到這些已注冊(cè)的服務(wù)。服務(wù)發(fā)現(xiàn)是支撐大規(guī)模 SOA 和微服務(wù)架構(gòu)的核心模塊,它應(yīng)該盡量做到高可用。
3. 流量削峰
如果觀看抽獎(jiǎng)或秒殺系統(tǒng)的請(qǐng)求監(jiān)控曲線,你就會(huì)發(fā)現(xiàn)這類系統(tǒng)在活動(dòng)開(kāi)放的時(shí)間段內(nèi)會(huì)出現(xiàn)一個(gè)波峰,而在活動(dòng)未開(kāi)放時(shí),系統(tǒng)的請(qǐng)求量、機(jī)器負(fù)載一般都是比較平穩(wěn)的。為了節(jié)省機(jī)器資源,我們不可能時(shí)時(shí)都提供最大化的資源能力來(lái)支持短時(shí)間的高峰請(qǐng)求。所以需要使用一些技術(shù)手段,來(lái)削弱瞬時(shí)的請(qǐng)求高峰,讓系統(tǒng)吞吐量在高峰請(qǐng)求下保持可控。削峰也可用于消除毛刺,使服務(wù)器資源利用更加均衡和充分。常見(jiàn)的削峰策略有隊(duì)列,限頻,分層過(guò)濾,多級(jí)緩存等。
4. 版本兼容
在升級(jí)版本的過(guò)程中,需要考慮升級(jí)版本后,新的數(shù)據(jù)結(jié)構(gòu)是否能夠理解和解析舊數(shù)據(jù),新修改的協(xié)議是否能夠理解舊的協(xié)議以及做出預(yù)期內(nèi)合適的處理。這就需要在服務(wù)設(shè)計(jì)過(guò)程中做好版本兼容。
5. 過(guò)載保護(hù)
過(guò)載是指當(dāng)前負(fù)載已經(jīng)超過(guò)了系統(tǒng)的最大處理能力,過(guò)載的出現(xiàn),會(huì)導(dǎo)致部分服務(wù)不可用,如果處置不當(dāng),極有可能引起服務(wù)完全不可用,乃至雪崩。過(guò)載保護(hù)正是針對(duì)這種異常情況做的措施,防止出現(xiàn)服務(wù)完全不可用的現(xiàn)象。
6. 服務(wù)熔斷
服務(wù)熔斷的作用類似于我們家用的保險(xiǎn)絲,當(dāng)某服務(wù)出現(xiàn)不可用或響應(yīng)超時(shí)的情況時(shí),為了防止整個(gè)系統(tǒng)出現(xiàn)雪崩,暫時(shí)停止對(duì)該服務(wù)的調(diào)用。
7. 服務(wù)降級(jí)
服務(wù)降級(jí)是當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)當(dāng)前業(yè)務(wù)情況及流量對(duì)一些服務(wù)和頁(yè)面有策略的降級(jí),以此釋放服務(wù)器資源以保證核心任務(wù)的正常運(yùn)行。降級(jí)往往會(huì)指定不同的級(jí)別,面臨不同的異常等級(jí)執(zhí)行不同的處理。
- 根據(jù)服務(wù)方式:可以拒接服務(wù),可以延遲服務(wù),也有時(shí)候可以隨機(jī)服務(wù)。
- 根據(jù)服務(wù)范圍:可以砍掉某個(gè)功能,也可以砍掉某些模塊。
總之服務(wù)降級(jí)需要根據(jù)不同的業(yè)務(wù)需求采用不同的降級(jí)策略。主要的目的就是服務(wù)雖然有損但是總比沒(méi)有好。
8. 熔斷VS降級(jí)
- 相同點(diǎn):目標(biāo)一致,都是從可用性和可靠性出發(fā),為了防止系統(tǒng)崩潰;用戶體驗(yàn)類似,最終都讓用戶體驗(yàn)到的是某些功能暫時(shí)不可用;
- 不同點(diǎn):觸發(fā)原因不同,服務(wù)熔斷一般是某個(gè)服務(wù)(下游服務(wù))故障引起,而服務(wù)降級(jí)一般是從整體負(fù)荷考慮;
9. 服務(wù)限流
限流可以認(rèn)為服務(wù)降級(jí)的一種,限流就是限制系統(tǒng)的輸入和輸出流量已達(dá)到保護(hù)系統(tǒng)的目的。一般來(lái)說(shuō)系統(tǒng)的吞吐量是可以被測(cè)算的,為了保證系統(tǒng)的穩(wěn)定運(yùn)行,一旦達(dá)到的需要限制的閾值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延遲處理,拒絕處理,或者部分拒絕處理等等。
10. 故障屏蔽
將故障機(jī)器從集群剔除,以保證新的請(qǐng)求不會(huì)分發(fā)到故障機(jī)器。
測(cè)試方法
1. 黑盒/白盒測(cè)試
黑盒測(cè)試不考慮程序內(nèi)部結(jié)構(gòu)和邏輯結(jié)構(gòu),主要是用來(lái)測(cè)試系統(tǒng)的功能是否滿足需求規(guī)格說(shuō)明書(shū)。一般會(huì)有一個(gè)輸入值,一個(gè)輸入值,和期望值做比較。
白盒測(cè)試主要應(yīng)用在單元測(cè)試階段,主要是對(duì)代碼級(jí)的測(cè)試,針對(duì)程序內(nèi)部邏輯結(jié)構(gòu),測(cè)試手段有:語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、路徑覆蓋、條件組合覆蓋
2. 單元/集成/系統(tǒng)/驗(yàn)收測(cè)試
軟件測(cè)試一般分為4個(gè)階段:?jiǎn)卧獪y(cè)試、集成測(cè)試、系統(tǒng)測(cè)試、驗(yàn)收測(cè)試。
- 單元測(cè)試:?jiǎn)卧獪y(cè)試是對(duì)軟件中的最小可驗(yàn)證單元進(jìn)行檢查和驗(yàn)證,如一個(gè)模塊、一個(gè)過(guò)程、一個(gè)方法等。單元測(cè)試粒度最小,一般由開(kāi)發(fā)小組采用白盒方式來(lái)測(cè)試,主要測(cè)試單元是否符合“設(shè)計(jì)”。
- 集成測(cè)試:集成測(cè)試也叫做組裝測(cè)試,通常在單元測(cè)試的基礎(chǔ)上,將所有的程序模塊進(jìn)行有序的、遞增的測(cè)試。集成測(cè)試界于單元測(cè)試和系統(tǒng)測(cè)試之間,起到“橋梁作用”,一般由開(kāi)發(fā)小組采用白盒加黑盒的方式來(lái)測(cè)試,既驗(yàn)證“設(shè)計(jì)”,又驗(yàn)證“需求”。
- 系統(tǒng)測(cè)試:系統(tǒng)測(cè)試時(shí)將經(jīng)過(guò)集成測(cè)試的軟件,作為計(jì)算機(jī)系統(tǒng)的一部分,與系統(tǒng)中其他部分結(jié)合起來(lái),在實(shí)際運(yùn)行環(huán)境下進(jìn)行一系列嚴(yán)格有效的測(cè)試,以發(fā)現(xiàn)軟件潛在的問(wèn)題,保證系統(tǒng)的正常運(yùn)行。系統(tǒng)測(cè)試的粒度最大,一般由獨(dú)立測(cè)試小組采用黑盒方式來(lái)測(cè)試,主要測(cè)試系統(tǒng)是否符合“需求規(guī)格說(shuō)明書(shū)”。
- 驗(yàn)收測(cè)試:驗(yàn)收測(cè)試也稱交付測(cè)試,是針對(duì)用戶需求、業(yè)務(wù)流程進(jìn)行的正式的測(cè)試,以確定系統(tǒng)是否滿足驗(yàn)收標(biāo)準(zhǔn),由用戶、客戶或其他授權(quán)機(jī)構(gòu)決定是否接受系統(tǒng)。驗(yàn)收測(cè)試與系統(tǒng)測(cè)試相似,主要區(qū)別是測(cè)試人員不同,驗(yàn)收測(cè)試由用戶執(zhí)行。
3. 回歸測(cè)試
當(dāng)發(fā)現(xiàn)并修改缺陷后,或在軟件中添加新的功能后,重新測(cè)試。用來(lái)檢查被發(fā)現(xiàn)的缺陷是否被改正,并且所做的修改沒(méi)有引發(fā)新的問(wèn)題。
4. 冒煙測(cè)試
這一術(shù)語(yǔ)源自硬件行業(yè)。對(duì)一個(gè)硬件或硬件組件進(jìn)行更改或修復(fù)后,直接給設(shè)備加電。如果沒(méi)有冒煙,則該組件就通過(guò)了測(cè)試。在軟件中,“冒煙測(cè)試”這一術(shù)語(yǔ)描述的是在將代碼更改嵌入到產(chǎn)品的源樹(shù)中之前對(duì)這些更改進(jìn)行驗(yàn)證的過(guò)程。
冒煙測(cè)試是在軟件開(kāi)發(fā)過(guò)程中的一種針對(duì)軟件版本包的快速基本功能驗(yàn)證策略,是對(duì)軟件基本功能進(jìn)行確認(rèn)驗(yàn)證的手段,并非對(duì)軟件版本包的深入測(cè)試。
比如:對(duì)于一個(gè)登錄系統(tǒng)的冒煙測(cè)試,我們只需測(cè)試輸入正確的用戶名、密碼,驗(yàn)證登錄這一個(gè)核心功能點(diǎn),至于輸入框、特殊字符等,可以在冒煙測(cè)試之后進(jìn)行。
5. 性能測(cè)試
性能測(cè)試是通過(guò)自動(dòng)化的測(cè)試工具模擬多種正常、峰值以及異常負(fù)載條件來(lái)對(duì)系統(tǒng)的各項(xiàng)性能指標(biāo)進(jìn)行測(cè)試。負(fù)載測(cè)試和壓力測(cè)試都屬于性能測(cè)試,兩者可以結(jié)合進(jìn)行。
- 通過(guò)負(fù)載測(cè)試,確定在各種工作負(fù)載下系統(tǒng)的性能,目標(biāo)是測(cè)試當(dāng)負(fù)載逐漸增加時(shí),系統(tǒng)各項(xiàng)性能指標(biāo)的變化情況。
- 壓力測(cè)試是通過(guò)確定一個(gè)系統(tǒng)的瓶頸或者不能接受的性能點(diǎn),來(lái)獲得系統(tǒng)能提供的最大服務(wù)級(jí)別的測(cè)試。
6. 基準(zhǔn)測(cè)試
基準(zhǔn)測(cè)試(Benchmark)也是一種性能測(cè)試方式,用來(lái)測(cè)量機(jī)器的硬件最高實(shí)際運(yùn)行性能,以及軟件優(yōu)化的性能提升效果, 同時(shí)也可以用來(lái)識(shí)別某段代碼的CPU或者內(nèi)存效率問(wèn)題. 許多開(kāi)發(fā)人員會(huì)用基準(zhǔn)測(cè)試來(lái)測(cè)試不同的并發(fā)模式, 或者用基準(zhǔn)測(cè)試來(lái)輔助配置工作池的數(shù)量, 以保證能最大化系統(tǒng)的吞吐量.
7. A/B測(cè)試
A/B測(cè)試,是用兩組及以上隨機(jī)分配的、數(shù)量相似的樣本進(jìn)行對(duì)比,如果實(shí)驗(yàn)組和對(duì)比組的實(shí)驗(yàn)結(jié)果相比,在目標(biāo)指標(biāo)上具有統(tǒng)計(jì)顯著性,那就可以說(shuō)明實(shí)驗(yàn)組的功能可以導(dǎo)致你想要的結(jié)果,從而幫你驗(yàn)證假設(shè)或者做出產(chǎn)品決定。
8. 代碼覆蓋測(cè)試
代碼覆蓋(Code coverage)是軟件測(cè)試中的一種度量,描述程式中源代碼被測(cè)試的比例和程度,所得比例稱為代碼覆蓋率。在做單元測(cè)試時(shí),代碼覆蓋率常常被拿來(lái)作為衡量測(cè)試好壞的指標(biāo),甚至,用代碼覆蓋率來(lái)考核測(cè)試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80%或 90%。于是乎,測(cè)試人員費(fèi)盡心思設(shè)計(jì)案例覆蓋代碼。
發(fā)布部署
1. DEV/PRO/FAT/UAT
- DEV(Development environment):開(kāi)發(fā)環(huán)境,用于開(kāi)發(fā)人員調(diào)試使用,版本變化較大。
- FAT(Feature Acceptance Test environment):功能驗(yàn)收測(cè)試環(huán)境,用于軟件測(cè)試人員測(cè)試使用。
- UAT(User Acceptance Test environment):用戶驗(yàn)收測(cè)試環(huán)境,用于生產(chǎn)環(huán)境下的功能驗(yàn)證,可作為預(yù)發(fā)布環(huán)境。
- PRO(Production environment):生產(chǎn)環(huán)境,正式線上環(huán)境。
2. 灰度發(fā)布
灰度發(fā)布是指在升級(jí)版本過(guò)程中,通過(guò)分區(qū)控制,白名單控制等方式對(duì)一部分用戶先升級(jí)產(chǎn)品特性,而其余用戶則保持不變,當(dāng)一段時(shí)間后升級(jí)產(chǎn)品特性的用戶沒(méi)有反饋問(wèn)題,就逐步擴(kuò)大范圍,最終向所有用戶開(kāi)放新版本特性,灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、修改問(wèn)題,以保證其影響度。
3. 回滾 (Rollback)
指的是程序或數(shù)據(jù)處理錯(cuò)誤時(shí),將程序或數(shù)據(jù)恢復(fù)到上一次正確狀態(tài)(或者是上一個(gè)穩(wěn)定版本)的行為。
以上就是小編為您整理的 史上最全的后端技術(shù) 的全部?jī)?nèi)容。