前言
真正優(yōu)秀的人诗宣,沒時間跟生活抬杠。生活從來沒有捷徑想诅,別人為了夢想默默耕耘召庞,只是你沒看到而已。停止為懶惰找借口来破,向著夢想勇敢前進篮灼。你未來的模樣,就藏在現(xiàn)在的努力里徘禁。
導(dǎo)語
后臺開發(fā)作為互聯(lián)網(wǎng)技術(shù)領(lǐng)域的掌上明珠诅诱,一直都是開發(fā)者們的追逐的高峰。這篇文也是我偶然看到一篇好文送朱,所以小瓜哥特地轉(zhuǎn)載過來給各位朋友相互分享娘荡!從后臺開發(fā)所涉及到的技術(shù)術(shù)語出發(fā)干旁,基于系統(tǒng)開發(fā)、架構(gòu)設(shè)計它改、網(wǎng)絡(luò)通信等幾個方面讓大家對后臺開發(fā)有一個清晰的了解疤孕,講解全面易懂。
工欲善其事央拖,必先利其器;士欲宣其義鹉戚,必先讀其書鲜戒。
系統(tǒng)開發(fā)
1. 高內(nèi)聚/低耦合
高內(nèi)聚指一個軟件模塊是由相關(guān)性很強的代碼組成,只負責(zé)一項任務(wù)抹凳,也就是常說的單一責(zé)任原則遏餐。模塊的內(nèi)聚反映模塊內(nèi)部聯(lián)系的緊密程度。
模塊之間聯(lián)系越緊密赢底,其耦合性就越強失都,模塊的獨立性則越差。模塊間耦合高低取決于模塊間接口的復(fù)雜性幸冻、調(diào)用的方式及傳遞的信息粹庞。一個完整的系統(tǒng),模塊與模塊之間洽损,盡可能的使其獨立存在庞溜。通常程序結(jié)構(gòu)中各模塊的內(nèi)聚程度越高,模塊間的耦合程度就越低碑定。
2. 過度設(shè)計
過度設(shè)計就是進行了過多的面向未來的設(shè)計或者說把相對簡單的事情想復(fù)雜了流码,過度追求模塊化、可擴展性延刘、設(shè)計模式等漫试,為系統(tǒng)增加了不必要的復(fù)雜度。
3. 過早優(yōu)化
過早指的不是在開發(fā)過程的早期碘赖,而是在還沒弄清楚需求未來的變化的走向的時候驾荣。你的優(yōu)化不僅可能導(dǎo)致你無法很好地實現(xiàn)新的需求,而且你對優(yōu)化的預(yù)期的猜測有可能還是錯的崖疤,導(dǎo)致實際上你除了把代碼變復(fù)雜以外什么都沒得到秘车。
正確的方法是,先有質(zhì)量地實現(xiàn)你的需求劫哼,寫夠testcase叮趴,然后做profile去找到性能的瓶頸,這個時候才做優(yōu)化权烧。
4. 重構(gòu) (Refactoring)
重構(gòu)(Refactoring)就是通過調(diào)整程序代碼改善軟件的質(zhì)量眯亦、性能伤溉,使其程序的設(shè)計模式和架構(gòu)更趨合理,提高軟件的擴展性和維護性妻率。
5. 破窗效應(yīng)
又稱破窗理論乱顾,破窗效應(yīng)(Broken windows theory)是犯罪學(xué)的一個理論。此理論認為環(huán)境中的不良現(xiàn)象如果被放任存在宫静,會誘使人們仿效走净,甚至變本加厲。一幢有少許破窗的建筑為例孤里,如果那些窗不被修理好伏伯,可能將會有破壞者破壞更多的窗戶。最終他們甚至?xí)J入建筑內(nèi)捌袜,如果發(fā)現(xiàn)無人居住说搅,也許就在那里定居或者縱火。
應(yīng)用在軟件工程上就是虏等,一定不能讓系統(tǒng)代碼或者架構(gòu)設(shè)計的隱患有冒頭的機會弄唧,否則隨著時間的推移,隱患會越來越重霍衫。反之候引,一個本身優(yōu)質(zhì)的系統(tǒng)拉一,會讓人不由自主的寫出優(yōu)質(zhì)的代碼松逊。
6. 互不信任原則
指在程序運行上下游的整個鏈路中,每個點都是不能保證絕對可靠的问窃,任何一個點都可能隨時發(fā)生故障或者不可預(yù)知的行為峰髓,包括機器網(wǎng)絡(luò)傻寂、服務(wù)本身、依賴環(huán)境携兵、輸入和請求等疾掰,因此要處處設(shè)防。
7. 持久化 (Persistence)
持久化是將程序數(shù)據(jù)在臨時狀態(tài)和持久狀態(tài)間轉(zhuǎn)換的機制徐紧。通俗的講静檬,就是臨時數(shù)據(jù)(比如內(nèi)存中的數(shù)據(jù),是不能永久保存的)持久化為持久數(shù)據(jù)(比如持久化至數(shù)據(jù)庫或者本地磁盤中并级,能夠長久保存)拂檩。
8. 臨界區(qū)
臨界區(qū)用來表示一種公共資源或者說是共享數(shù)據(jù),可以被多個線程使用嘲碧,但是每一次稻励,只能有一個線程使用它,一旦臨界區(qū)資源被占用,其他線程要想使用這個資源望抽,就必須等待加矛。
9. 阻塞/非阻塞
阻塞和非阻塞通常形容多線程間的相互影響。比如一個線程占用了臨界區(qū)資源煤篙,那么其它所有需要這個資源的線程就必須在這個臨界區(qū)中進行等待斟览,等待會導(dǎo)致線程掛起。這種情況就是阻塞辑奈。此時苛茂,如果占用資源的線程一直不愿意釋放資源,那么其它所有阻塞在這個臨界區(qū)上的線程都不能工作鸠窗。而非阻塞允許多個線程同時進入臨界區(qū)味悄。
10. 同步/異步
通常同步和異步是指函數(shù)/方法調(diào)用方面。
同步就是在發(fā)出一個函數(shù)調(diào)用時塌鸯,在沒有得到結(jié)果之前,該調(diào)用就不返回唐片。異步調(diào)用會瞬間返回丙猬,但是異步調(diào)用瞬間返回并不代表你的任務(wù)就完成了,他會在后臺起個線程繼續(xù)進行任務(wù)费韭,等任務(wù)執(zhí)行完畢后通過回調(diào)callback或其他方式通知調(diào)用方茧球。
11. 并發(fā)/并行
并行(parallel)指在同一時刻,有多條指令在多個處理器上同時執(zhí)行星持。所以無論從微觀還是從宏觀來看抢埋,二者都是一起執(zhí)行的。
并發(fā)(concurrency)指在同一時刻只能有一條指令執(zhí)行督暂,但多個進程指令被快速的輪換執(zhí)行揪垄,使得在宏觀上具有多個進程同時執(zhí)行的效果,但在微觀上并不是同時執(zhí)行的逻翁,只是把時間分成若干段饥努,使多個進程快速交替的執(zhí)行。
架構(gòu)設(shè)計
1. 高并發(fā) (High Concurrency)
由于分布式系統(tǒng)的問世八回,高并發(fā)(High Concurrency)通常是指通過設(shè)計保證系統(tǒng)能夠同時并行處理很多請求酷愧。通俗來講,高并發(fā)是指在同一個時間點缠诅,有很多用戶同時的訪問同一 API 接口或者 Url 地址溶浴。它經(jīng)常會發(fā)生在有大活躍用戶量,用戶高聚集的業(yè)務(wù)場景中管引。
2. 高可用 (High Availability)
高可用HA(High Availability)是分布式系統(tǒng)架構(gòu)設(shè)計中必須考慮的因素之一士败,它通常是指,一個系統(tǒng)經(jīng)過專門的設(shè)計汉匙,以減少停工時間拱烁,而保持其服務(wù)的高度可用性生蚁。
3. 讀寫分離
為了確保數(shù)據(jù)庫產(chǎn)品的穩(wěn)定性,很多數(shù)據(jù)庫擁有雙機熱備功能戏自。也就是邦投,第一臺數(shù)據(jù)庫服務(wù)器,是對外提供增刪改業(yè)務(wù)的生產(chǎn)服務(wù)器擅笔;第二臺數(shù)據(jù)庫服務(wù)器志衣,主要進行讀的操作。
4. 冷備/熱備
冷備:兩個服務(wù)器猛们,一臺運行念脯,一臺不運行做為備份。這樣一旦運行的服務(wù)器宕機弯淘,就把備份的服務(wù)器運行起來绿店。冷備的方案比較容易實現(xiàn),但冷備的缺點是主機出現(xiàn)故障時備機不會自動接管庐橙,需要主動切換服務(wù)假勿。
熱備:即是通常所說的active/standby方式,服務(wù)器數(shù)據(jù)包括數(shù)據(jù)庫數(shù)據(jù)同時往兩臺或多臺服務(wù)器寫态鳖。當(dāng)active服務(wù)器出現(xiàn)故障的時候转培,通過軟件診測(一般是通過心跳診斷)將standby機器激活,保證應(yīng)用在短時間內(nèi)完全恢復(fù)正常使用浆竭。當(dāng)一臺服務(wù)器宕機后浸须,自動切換到另一臺備用機使用。
5. 異地多活
異地多活一般是指在不同城市建立獨立的數(shù)據(jù)中心邦泄,“活”是相對于冷備份而言的删窒,冷備份是備份全量數(shù)據(jù),平時不支撐業(yè)務(wù)需求虎韵,只有在主機房出現(xiàn)故障的時候才會切換到備用機房易稠,而多活,是指這些機房在日常的業(yè)務(wù)中也需要走流量包蓝,做業(yè)務(wù)支撐驶社。
6. 負載均衡 (Load Balance)
負載均衡,是對多臺服務(wù)器進行流量分發(fā)的負載均衡服務(wù)测萎⊥龅纾可在多個實例間自動分配應(yīng)用程序的對外服務(wù)能力,通過消除單點故障提升應(yīng)用系統(tǒng)的可用性硅瞧,讓您實現(xiàn)更高水平的應(yīng)用程序容錯能力份乒,從而無縫提供分配應(yīng)用程序流量所需的負載均衡容量,為您提供高效、穩(wěn)定或辖、安全的服務(wù)瘾英。
7. 動靜分離
動靜分離是指在web服務(wù)器架構(gòu)中,將靜態(tài)頁面與動態(tài)頁面或者靜態(tài)內(nèi)容接口和動態(tài)內(nèi)容接口分開不同系統(tǒng)訪問的架構(gòu)設(shè)計方法颂暇,進而提升整個服務(wù)訪問性能和可維護性缺谴。
8. 集群
單臺服務(wù)器的并發(fā)承載能力總是有限的,當(dāng)單臺服務(wù)器處理能力達到性能瓶頸的時耳鸯,將多臺服務(wù)器組合起來提供服務(wù)湿蛔,這種組合方式稱之為集群,集群中每臺服務(wù)器就叫做這個集群的一個“節(jié)點”县爬,每個節(jié)點都能提供相同的服務(wù)阳啥,從而成倍的提升整個系統(tǒng)的并發(fā)處理能力。
9. 分布式
分布式系統(tǒng)就是將一個完整的系統(tǒng)按照業(yè)務(wù)功能拆分成很多獨立的子系統(tǒng)财喳,每個子系統(tǒng)就被稱為“服務(wù)”察迟,分布式系統(tǒng)將請求分揀和分發(fā)到不同的子系統(tǒng),讓不同的服務(wù)來處理不同的請求耳高。在分布式系統(tǒng)中卷拘,子系統(tǒng)獨立運行,它們之間通過網(wǎng)絡(luò)通信連接起來實現(xiàn)數(shù)據(jù)互通和組合服務(wù)祝高。
10. CAP理論
CAP理論,指的是在一個分布式系統(tǒng)中污筷,Consistency(一致性)工闺、Availability(可用性)、Partition Tolerance(分區(qū)容錯性)瓣蛀,不能同時成立陆蟆。
一致性:它要求在同一時刻點,分布式系統(tǒng)中的所有數(shù)據(jù)備份都相同或者都處于同一狀態(tài)惋增。
可用性:在系統(tǒng)集群的一部分節(jié)點宕機后叠殷,系統(tǒng)依然能夠正確的響應(yīng)用戶的請求。
分區(qū)容錯性:系統(tǒng)能夠容忍節(jié)點之間的網(wǎng)絡(luò)通信的故障诈皿。
簡單的來說林束,在一個分布式系統(tǒng)中,最多能支持上面的兩種屬性稽亏。但顯然既然是分布式注定我們是必然要進行分區(qū)壶冒,既然分區(qū),我們就無法百分百避免分區(qū)的錯誤截歉。因此胖腾,我們只能在一致性和可用性去作出選擇。
在分布式系統(tǒng)中,我們往往追求的是可用性咸作,它的重要性比一致性要高锨阿,那么如何實現(xiàn)高可用,這里又有一個理論记罚,就是 BASE 理論墅诡,它給 CAP 理論做了進一步的擴充。
11. BASE理論
BASE 理論指出:
Basically Available(基本可用)
Soft state(軟狀態(tài))
Eventually consistent(最終一致性)
BASE 理論是對 CAP 中的一致性和可用性進行一個權(quán)衡的結(jié)果毫胜,理論的核心思想就是:我們無法做到強一致书斜,但每個應(yīng)用都可以根據(jù)自身的業(yè)務(wù)特點,采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達到最終一致性酵使。
12. 水平擴展/垂直擴展
水平擴展 Scale Out通過增加更多的服務(wù)器或者程序?qū)嵗齺矸稚⒇撦d荐吉,從而提升存儲能力和計算能力。
垂直擴展 Scale Up?提升單機處理能力口渔。
垂直擴展的方式又有兩種:
(1)增強單機硬件性能样屠,例如:增加CPU核數(shù)如32核,升級更好的網(wǎng)卡如萬兆缺脉,升級更好的硬盤如SSD痪欲,擴充硬盤容量如2T,擴充系統(tǒng)內(nèi)存如128G;
(2)提升單機軟件或者架構(gòu)性能攻礼,例如:使用Cache來減少IO次數(shù)业踢,使用異步來增加單服務(wù)吞吐量,使用無鎖數(shù)據(jù)結(jié)構(gòu)來減少響應(yīng)時間礁扮;
13. 平行擴容
與水平擴展類似知举。集群服務(wù)器中的節(jié)點均為平行對等節(jié)點,當(dāng)需要擴容時太伊,可以通過添加更多節(jié)點以提高集群的服務(wù)能力雇锡。一般來說服務(wù)器中關(guān)鍵路徑(如服務(wù)器中的登錄、支付僚焦、核心業(yè)務(wù)邏輯等)都需要支持運行時動態(tài)平行擴容锰提。
14. 彈性擴容
指對部署的集群進行動態(tài)在線擴容。彈性擴容系統(tǒng)可以根據(jù)實際業(yè)務(wù)環(huán)境按照一定策略自動地添加更多的節(jié)點(包括存儲節(jié)點芳悲、計算節(jié)點立肘、網(wǎng)絡(luò)節(jié)點)來增加系統(tǒng)容量、提高系統(tǒng)性能或者增強系統(tǒng)可靠性名扛,或者同時完成這三個目標(biāo)赛不。
15. 狀態(tài)同步/幀同步
狀態(tài)同步:狀態(tài)同步是指服務(wù)器負責(zé)計算全部的游戲邏輯,并且廣播這些計算的結(jié)果罢洲,客戶端僅僅負責(zé)發(fā)送玩家的操作踢故,以及表現(xiàn)收到的游戲結(jié)果文黎。
特征:狀態(tài)同步安全性高,邏輯更新方便殿较,斷線重連快耸峭,但是開發(fā)效率較低,網(wǎng)絡(luò)流量隨游戲復(fù)雜度增加淋纲,服務(wù)器需要承載更大壓力劳闹。
幀同步:服務(wù)端只轉(zhuǎn)發(fā)消息,不做任何邏輯處理洽瞬,各客戶端每秒幀數(shù)一致本涕,在每一幀都處理同樣的輸入數(shù)據(jù)。
特征:幀同步需要保證系統(tǒng)在相同的輸入下伙窃,要有相同的輸出菩颖。幀同步開發(fā)效率高,流量消耗低而且穩(wěn)定为障,對服務(wù)器的壓力非常小晦闰。但是網(wǎng)絡(luò)要求高,斷線重連時間長鳍怨,客戶端計算壓力大呻右。
網(wǎng)絡(luò)通信
1. 連接池
預(yù)先建立一個連接緩沖池,并提供一套連接使用鞋喇、分配声滥、管理策略,使得該連接池中的連接可以得到高效侦香、安全的復(fù)用醒串,避免了連接頻繁建立、關(guān)閉的開銷鄙皇。
2. 斷線重連
由于網(wǎng)絡(luò)波動造成用戶間歇性的斷開與服務(wù)器的連接,待網(wǎng)絡(luò)恢復(fù)之后服務(wù)器嘗試將用戶連接到上次斷開時的狀態(tài)和數(shù)據(jù)仰挣。
3. 會話保持
會話保持是指在負載均衡器上的一種機制伴逸,可以識別客戶端與服務(wù)器之間交互過程的關(guān)連性,在作負載均衡的同時還保證一系列相關(guān)連的訪問請求都會分配到一臺機器上膘壶。用人話來表述就是:在一次會話過程中發(fā)起的多個請求都會落到同一臺機器上错蝴。
4. 長連接/短連接
通常是指TCP的長連接和短連接。長連接就是建立TCP連接后颓芭,一直保持這個連接顷锰,一般會中間彼此發(fā)送心跳來確認對應(yīng)的存在,中間會做多次業(yè)務(wù)數(shù)據(jù)傳輸亡问,一般不會主動斷開連接官紫。短連接一般指建立連接后肛宋,執(zhí)行一次事務(wù)后(如:http請求),然后就關(guān)掉這個連接束世。
5. 流量控制/擁塞控制
流量控制防止發(fā)送方發(fā)的太快酝陈,耗盡接收方的資源,從而使接收方來不及處理毁涉。
擁塞控制防止發(fā)送方發(fā)的太快沉帮,使得網(wǎng)絡(luò)來不及處理產(chǎn)生擁塞,進而引起這部分乃至整個網(wǎng)絡(luò)性能下降的現(xiàn)象贫堰,嚴(yán)重時甚至?xí)?dǎo)致網(wǎng)絡(luò)通信業(yè)務(wù)陷入停頓穆壕。
6. 驚群效應(yīng)
驚群效應(yīng)也有人叫做雷鳴群體效應(yīng),不過叫什么其屏,簡言之喇勋,驚群現(xiàn)象就是多進程(多線程)在同時阻塞等待同一個事件的時候(休眠狀態(tài)),如果等待的這個事件發(fā)生漫玄,那么他就會喚醒等待的所有進程(或者線程)茄蚯,但是最終卻只可能有一個進程(線程)獲得這個時間的“控制權(quán)”,對該事件進行處理睦优,而其他進程(線程)獲取“控制權(quán)”失敗渗常,只能重新進入休眠狀態(tài),這種現(xiàn)象和性能浪費就叫做驚群汗盘。
7. NAT
NAT(Network Address Translation皱碘,網(wǎng)絡(luò)地址轉(zhuǎn)換),就是替換IP報文頭部的地址信息隐孽。NAT通常部署在一個組織的網(wǎng)絡(luò)出口位置癌椿,通過將內(nèi)部網(wǎng)絡(luò)IP地址替換為出口的IP地址提供公網(wǎng)可達性和上層協(xié)議的連接能力。
故障異常
1. 宕機
宕機菱阵,一般情況下指的就是計算機主機出現(xiàn)意外故障而死機踢俄。其次,一些服務(wù)器例如數(shù)據(jù)庫死鎖也可以稱為宕機晴及,一些服務(wù)器的某些服務(wù)掛掉了都办,就可以這么說。
2. coredump
當(dāng)程序出錯而異常中斷時虑稼,OS會把程序工作的當(dāng)前狀態(tài)存儲成一個coredunmp文件琳钉。通常情況下coredump文件包含了程序運行時的內(nèi)存,寄存器狀態(tài)蛛倦,堆棧指針歌懒,內(nèi)存管理信息等。
3. 緩存穿透/擊穿/雪崩
緩存穿透:緩存穿透是指查詢一個一定不存在的數(shù)據(jù)溯壶,由于緩存是不命中時需要從數(shù)據(jù)庫查詢及皂,查不到數(shù)據(jù)則不寫入緩存甫男,這將導(dǎo)致這個不存在的數(shù)據(jù)每次請求都要到數(shù)據(jù)庫去查詢,進而給數(shù)據(jù)庫帶來壓力躲庄。
緩存擊穿:緩存擊穿是指熱點key在某個時間點過期的時候查剖,而恰好在這個時間點對這個Key有大量的并發(fā)請求過來,從而大量的請求打到db噪窘。
緩存雪崩:緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時間笋庄,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫壓力過大甚至down機倔监。
與緩存擊穿不同的是:存擊穿是熱點key失效直砂,緩存雪崩是大量的key同時失效。
4. 500/501/502/503/504/505
500 Internal Server Error:內(nèi)部服務(wù)錯誤浩习,一般是服務(wù)器遇到意外情況静暂,而無法完成請求∑谆啵可能原因: 1洽蛀、程序錯誤,例如:ASP或者PHP語法錯誤疟赊;2郊供、高并發(fā)導(dǎo)致,系統(tǒng)資源限制不能打開過多的文件所致近哟。
501Not implemented:服務(wù)器不理解或不支持請求的HTTP請求驮审。
502Bad Gateway:WEB服務(wù)器故障,可能是由于程序進程不夠吉执,請求的php-fpm已經(jīng)執(zhí)行疯淫,但是由于某種原因而沒有執(zhí)行完畢,最終導(dǎo)致php-fpm進程終止戳玫∥醪簦可能原因:1、Nginx服務(wù)器咕宿,php-cgi進程數(shù)不夠用币绩;2、PHP執(zhí)行時間過長荠列;3、php-cgi進程死掉载城;
503Service Unavailable:服務(wù)器目前無法使用肌似。系統(tǒng)維護服務(wù)器暫時的無法處理客戶端的請求,這只是暫時狀態(tài)诉瓦〈ǘ樱可以聯(lián)系下服務(wù)器提供商力细。
504Gateway Timeout:服務(wù)器504錯誤表示超時,是指客戶端所發(fā)出的請求沒有到達網(wǎng)關(guān)固额,請求沒有到可以執(zhí)行的php-fpm眠蚂,一般是與nginx.conf的配置有關(guān)。
505HTTP Version Not Supported:服務(wù)器不支持請求中所用的 HTTP 協(xié)議版本斗躏。(HTTP 版本不受支持)
除了500錯誤可能是程序語言錯誤逝慧,其余的報錯,都大概可以理解為服務(wù)器或者服務(wù)器配置出現(xiàn)問題啄糙。
5. 內(nèi)存溢出/內(nèi)存泄漏
內(nèi)存溢出:內(nèi)存溢出(Out Of Memory)指程序申請內(nèi)存時笛臣,沒有足夠的內(nèi)存供申請者使用,或者說隧饼,給了你一塊存儲int類型數(shù)據(jù)的存儲空間沈堡,但是你卻存儲long類型的數(shù)據(jù),那么結(jié)果就是內(nèi)存不夠用燕雁,此時就會報錯OOM,即所謂的內(nèi)存溢出诞丽。
內(nèi)存泄漏:內(nèi)存泄漏(Memory Leak)指程序中己動態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放,造成系統(tǒng)內(nèi)存的浪費拐格,導(dǎo)致程序運行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果僧免。
6. 句柄泄漏
句柄泄漏是進程在調(diào)用系統(tǒng)文件之后,沒有釋放已經(jīng)打開的文件句柄禁荒。一般句柄泄漏后的現(xiàn)象是猬膨,機器變慢,CPU飆升呛伴,出現(xiàn)句柄泄漏的cgi或server的CPU使用率增加勃痴。
7. 死鎖
死鎖是指兩個或兩個以上的線程在執(zhí)行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象热康,若無外力作用沛申,它們都抑制處于阻塞狀態(tài)并無法進行下去,此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖姐军。
8. 軟中斷/硬中斷
硬中斷:我們通常所說的中斷指的是硬中斷(hardirq)铁材。
主要是用來通知操作系統(tǒng)系統(tǒng)外設(shè)狀態(tài)的變化。
軟中斷:1奕锌、通常是硬中斷服務(wù)程序?qū)?nèi)核的中斷著觉;2、為了滿足實時系統(tǒng)的要求惊暴,中斷處理應(yīng)該是越快越好饼丘。
linux為了實現(xiàn)這個特點,當(dāng)中斷發(fā)生的時候辽话,硬中斷處理那些短時間就可以完成的工作肄鸽,而將那些處理事件比較長的工作卫病,放到中斷之后來完成,也就是軟中斷(softirq)來完成典徘。
9. 毛刺
在短暫的某一刻蟀苛,服務(wù)器性能指標(biāo)(如流量、磁盤IO逮诲、CPU使用率等)遠大于該時刻前后時間段帜平。毛刺的出現(xiàn)代表這服務(wù)器資源利用不均勻,不充分汛骂,容易誘發(fā)其他更嚴(yán)重的問題罕模。
10. 重放攻擊
攻擊者發(fā)送一個目的主機已接收過的包,來達到欺騙系統(tǒng)的目的帘瞭,主要用于身份認證過程淑掌,破壞認證的正確性。它是一種攻擊類型蝶念,這種攻擊會不斷惡意或欺詐性地重復(fù)一個有效的數(shù)據(jù)傳輸抛腕,重放攻擊可以由發(fā)起者,也可以由攔截并重發(fā)該數(shù)據(jù)的敵方進行媒殉。攻擊者利用網(wǎng)絡(luò)監(jiān)聽或者其他方式盜取認證憑據(jù)担敌,之后再把它重新發(fā)給認證服務(wù)器。
11. 網(wǎng)絡(luò)孤島
網(wǎng)絡(luò)孤島指集群環(huán)境中廷蓉,部分機器與整個集群失去網(wǎng)絡(luò)連接全封,分裂為一個小集群并且發(fā)生數(shù)據(jù)不一致的狀況。
12. 數(shù)據(jù)傾斜
對于集群系統(tǒng)桃犬,一般緩存是分布式的刹悴,即不同節(jié)點負責(zé)一定范圍的緩存數(shù)據(jù)。我們把緩存數(shù)據(jù)分散度不夠攒暇,導(dǎo)致大量的緩存數(shù)據(jù)集中到了一臺或者幾臺服務(wù)節(jié)點上土匀,稱為數(shù)據(jù)傾斜。一般來說數(shù)據(jù)傾斜是由于負載均衡實施的效果不好引起的形用。
13. 腦裂
腦裂是指在集群系統(tǒng)中就轧,部分節(jié)點之間網(wǎng)絡(luò)不可達而引起的系統(tǒng)分裂,不同分裂的小集群會按照各自的狀態(tài)提供服務(wù)田度,原本的集群會同時存在不一致的反應(yīng)妒御,造成節(jié)點之間互相爭搶資源,系統(tǒng)混亂镇饺,數(shù)據(jù)損壞乎莉。
監(jiān)控告警
1. 服務(wù)監(jiān)控
服務(wù)監(jiān)控主要目的在服務(wù)出現(xiàn)問題或者快要出現(xiàn)問題時能夠準(zhǔn)確快速地發(fā)現(xiàn)以減小影響范圍。服務(wù)監(jiān)控一般有多種手段,按層次可劃分為:
系統(tǒng)層(CPU梦鉴、網(wǎng)絡(luò)狀態(tài)、IO揭保、機器負載等)
應(yīng)用層(進程狀態(tài)肥橙、錯誤日志、吞吐量等)
業(yè)務(wù)層(服務(wù)/接口的錯誤碼秸侣、響應(yīng)時間)
用戶層(用戶行為存筏、輿情監(jiān)控、前端埋點)
2. 全鏈路監(jiān)控
服務(wù)撥測:服務(wù)撥測是探測服務(wù)(應(yīng)用)可用性的監(jiān)控方式味榛,通過撥測節(jié)點對目標(biāo)服務(wù)進行周期性探測椭坚,主要通過可用性和響應(yīng)時間來度量,撥測節(jié)點通常有異地多個搏色。
節(jié)點探測:節(jié)點探測是用來發(fā)現(xiàn)和追蹤不同的機房(數(shù)據(jù)中心)節(jié)點之間網(wǎng)絡(luò)可用性和通暢性的監(jiān)控方式善茎,主要通過響應(yīng)時間、丟包率频轿、跳數(shù)來度量垂涯,探測方法一般是ping、mtr或其他私有協(xié)議航邢。
告警過濾:對某些可預(yù)知的告警進行過濾耕赘,不進入告警統(tǒng)計的數(shù)據(jù),如少量爬蟲訪問導(dǎo)致的http響應(yīng)500錯誤膳殷,業(yè)務(wù)系統(tǒng)自定義異常信息等操骡。
告警去重:當(dāng)一個告警通知負責(zé)人后,在這個告警恢復(fù)之前赚窃,不會繼續(xù)收到相同的告警册招。
告警抑制:為了減少由于系統(tǒng)抖動帶來的干擾,還需要實現(xiàn)抑制考榨,例如服務(wù)器瞬間高負載跨细,可能是正常的,只有持續(xù)一段時間的高負載才需要得到重視河质。
告警恢復(fù):開發(fā)/運維人員不僅需要收到告警通知冀惭,還需要收到故障消除告警恢復(fù)正常的通知。
告警合并:對同一時刻產(chǎn)生的多條相同告警進行合并掀鹅,如某個微服務(wù)集群同一時刻出現(xiàn)多個子服務(wù)負載過高的告警散休,需要合并成為一條告警。
告警收斂:有時某個告警產(chǎn)生時乐尊,往往會伴隨著其它告警戚丸。這時可以只對根本原因產(chǎn)生告警,其它告警收斂為子告警一并發(fā)送通知。如云服務(wù)器出現(xiàn)CPU負載告警時往往伴隨其搭載的所有系統(tǒng)的可用性告警限府。
故障自愈:實時發(fā)現(xiàn)告警夺颤,預(yù)診斷分析,自動恢復(fù)故障胁勺,并打通周邊系統(tǒng)實現(xiàn)整個流程的閉環(huán)世澜。
服務(wù)治理
1. 微服務(wù)
微服務(wù)架構(gòu)是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù)署穗,服務(wù)之間相互協(xié)調(diào)寥裂、互相配合,為用戶提供最終價值案疲。每個服務(wù)運行在其獨立的進程中封恰,服務(wù)和服務(wù)之間采用輕量級的通信機制相互溝通(通常是基于HTTP的Restful API).每個服務(wù)都圍繞著具體的業(yè)務(wù)進行構(gòu)建,并且能夠被獨立的部署到生產(chǎn)環(huán)境褐啡、類生產(chǎn)環(huán)境等诺舔。
2. 服務(wù)發(fā)現(xiàn)
服務(wù)發(fā)現(xiàn)是指使用一個注冊中心來記錄分布式系統(tǒng)中的全部服務(wù)的信息,以便其他服務(wù)能夠快速的找到這些已注冊的服務(wù)备畦。服務(wù)發(fā)現(xiàn)是支撐大規(guī)模 SOA 和微服務(wù)架構(gòu)的核心模塊混萝,它應(yīng)該盡量做到高可用。
3. 流量削峰
如果觀看抽獎或秒殺系統(tǒng)的請求監(jiān)控曲線萍恕,你就會發(fā)現(xiàn)這類系統(tǒng)在活動開放的時間段內(nèi)會出現(xiàn)一個波峰逸嘀,而在活動未開放時,系統(tǒng)的請求量允粤、機器負載一般都是比較平穩(wěn)的崭倘。為了節(jié)省機器資源,我們不可能時時都提供最大化的資源能力來支持短時間的高峰請求类垫。所以需要使用一些技術(shù)手段司光,來削弱瞬時的請求高峰,讓系統(tǒng)吞吐量在高峰請求下保持可控悉患。削峰也可用于消除毛刺残家,使服務(wù)器資源利用更加均衡和充分。常見的削峰策略有隊列售躁,限頻坞淮,分層過濾,多級緩存等陪捷。
4. 版本兼容
在升級版本的過程中回窘,需要考慮升級版本后,新的數(shù)據(jù)結(jié)構(gòu)是否能夠理解和解析舊數(shù)據(jù)市袖,新修改的協(xié)議是否能夠理解舊的協(xié)議以及做出預(yù)期內(nèi)合適的處理啡直。這就需要在服務(wù)設(shè)計過程中做好版本兼容。
5. 過載保護
過載是指當(dāng)前負載已經(jīng)超過了系統(tǒng)的最大處理能力,過載的出現(xiàn)酒觅,會導(dǎo)致部分服務(wù)不可用撮执,如果處置不當(dāng),極有可能引起服務(wù)完全不可用舷丹,乃至雪崩二打。過載保護正是針對這種異常情況做的措施,防止出現(xiàn)服務(wù)完全不可用的現(xiàn)象掂榔。
6. 服務(wù)熔斷
服務(wù)熔斷的作用類似于我們家用的保險絲,當(dāng)某服務(wù)出現(xiàn)不可用或響應(yīng)超時的情況時症杏,為了防止整個系統(tǒng)出現(xiàn)雪崩装获,暫時停止對該服務(wù)的調(diào)用。
7. 服務(wù)降級
服務(wù)降級是當(dāng)服務(wù)器壓力劇增的情況下厉颤,根據(jù)當(dāng)前業(yè)務(wù)情況及流量對一些服務(wù)和頁面有策略的降級穴豫,以此釋放服務(wù)器資源以保證核心任務(wù)的正常運行视卢。降級往往會指定不同的級別虑绵,面臨不同的異常等級執(zhí)行不同的處理子漩。
根據(jù)服務(wù)方式:可以拒接服務(wù)禀苦,可以延遲服務(wù)乔夯,也有時候可以隨機服務(wù)搀玖。
根據(jù)服務(wù)范圍:可以砍掉某個功能绪励,也可以砍掉某些模塊铐炫。
總之服務(wù)降級需要根據(jù)不同的業(yè)務(wù)需求采用不同的降級策略黎烈。主要的目的就是服務(wù)雖然有損但是總比沒有好习柠。
8. 熔斷VS降級
相同點:目標(biāo)一致,都是從可用性和可靠性出發(fā)照棋,為了防止系統(tǒng)崩潰资溃;用戶體驗類似,最終都讓用戶體驗到的是某些功能暫時不可用烈炭;
不同點:觸發(fā)原因不同溶锭,服務(wù)熔斷一般是某個服務(wù)(下游服務(wù))故障引起,而服務(wù)降級一般是從整體負荷考慮符隙;
9. 服務(wù)限流
限流可以認為服務(wù)降級的一種趴捅,限流就是限制系統(tǒng)的輸入和輸出流量已達到保護系統(tǒng)的目的。一般來說系統(tǒng)的吞吐量是可以被測算的霹疫,為了保證系統(tǒng)的穩(wěn)定運行驻售,一旦達到的需要限制的閾值,就需要限制流量并采取一些措施以完成限制流量的目的更米。比如:延遲處理欺栗,拒絕處理,或者部分拒絕處理等等。
10. 故障屏蔽
將故障機器從集群剔除迟几,以保證新的請求不會分發(fā)到故障機器消请。
測試方法
1. 黑盒/白盒測試
黑盒測試不考慮程序內(nèi)部結(jié)構(gòu)和邏輯結(jié)構(gòu),主要是用來測試系統(tǒng)的功能是否滿足需求規(guī)格說明書类腮。一般會有一個輸入值臊泰,一個輸入值,和期望值做比較蚜枢。
白盒測試主要應(yīng)用在單元測試階段缸逃,主要是對代碼級的測試,針對程序內(nèi)部邏輯結(jié)構(gòu)厂抽,測試手段有:語句覆蓋需频、判定覆蓋、條件覆蓋筷凤、路徑覆蓋昭殉、條件組合覆蓋
2. 單元/集成/系統(tǒng)/驗收測試
軟件測試一般分為4個階段:單元測試、集成測試藐守、系統(tǒng)測試挪丢、驗收測試。
單元測試:單元測試是對軟件中的最小可驗證單元進行檢查和驗證卢厂,如一個模塊乾蓬、一個過程、一個方法等慎恒。單元測試粒度最小巢块,一般由開發(fā)小組采用白盒方式來測試,主要測試單元是否符合“設(shè)計”巧号。
集成測試:集成測試也叫做組裝測試族奢,通常在單元測試的基礎(chǔ)上,將所有的程序模塊進行有序的丹鸿、遞增的測試越走。集成測試界于單元測試和系統(tǒng)測試之間,起到“橋梁作用”靠欢,一般由開發(fā)小組采用白盒加黑盒的方式來測試廊敌,既驗證“設(shè)計”,又驗證“需求”门怪。
系統(tǒng)測試:系統(tǒng)測試時將經(jīng)過集成測試的軟件骡澈,作為計算機系統(tǒng)的一部分,與系統(tǒng)中其他部分結(jié)合起來掷空,在實際運行環(huán)境下進行一系列嚴(yán)格有效的測試肋殴,以發(fā)現(xiàn)軟件潛在的問題囤锉,保證系統(tǒng)的正常運行。系統(tǒng)測試的粒度最大护锤,一般由獨立測試小組采用黑盒方式來測試官地,主要測試系統(tǒng)是否符合“需求規(guī)格說明書”。
驗收測試:驗收測試也稱交付測試烙懦,是針對用戶需求驱入、業(yè)務(wù)流程進行的正式的測試,以確定系統(tǒng)是否滿足驗收標(biāo)準(zhǔn)氯析,由用戶亏较、客戶或其他授權(quán)機構(gòu)決定是否接受系統(tǒng)。驗收測試與系統(tǒng)測試相似掩缓,主要區(qū)別是測試人員不同雪情,驗收測試由用戶執(zhí)行。
3. 回歸測試
當(dāng)發(fā)現(xiàn)并修改缺陷后拾因,或在軟件中添加新的功能后,重新測試旷余。用來檢查被發(fā)現(xiàn)的缺陷是否被改正绢记,并且所做的修改沒有引發(fā)新的問題。
4. 冒煙測試
這一術(shù)語源自硬件行業(yè)正卧。對一個硬件或硬件組件進行更改或修復(fù)后蠢熄,直接給設(shè)備加電。如果沒有冒煙炉旷,則該組件就通過了測試签孔。在軟件中,“冒煙測試”這一術(shù)語描述的是在將代碼更改嵌入到產(chǎn)品的源樹中之前對這些更改進行驗證的過程窘行。
冒煙測試是在軟件開發(fā)過程中的一種針對軟件版本包的快速基本功能驗證策略饥追,是對軟件基本功能進行確認驗證的手段,并非對軟件版本包的深入測試罐盔。
比如:對于一個登錄系統(tǒng)的冒煙測試但绕,我們只需測試輸入正確的用戶名、密碼惶看,驗證登錄這一個核心功能點捏顺,至于輸入框、特殊字符等纬黎,可以在冒煙測試之后進行幅骄。
5. 性能測試
性能測試是通過自動化的測試工具模擬多種正常、峰值以及異常負載條件來對系統(tǒng)的各項性能指標(biāo)進行測試本今。負載測試和壓力測試都屬于性能測試拆座,兩者可以結(jié)合進行主巍。
通過負載測試,確定在各種工作負載下系統(tǒng)的性能懂拾,目標(biāo)是測試當(dāng)負載逐漸增加時煤禽,系統(tǒng)各項性能指標(biāo)的變化情況。
壓力測試是通過確定一個系統(tǒng)的瓶頸或者不能接受的性能點岖赋,來獲得系統(tǒng)能提供的最大服務(wù)級別的測試檬果。
6. 基準(zhǔn)測試
基準(zhǔn)測試(Benchmark)也是一種性能測試方式,用來測量機器的硬件最高實際運行性能唐断,以及軟件優(yōu)化的性能提升效果, 同時也可以用來識別某段代碼的CPU或者內(nèi)存效率問題. 許多開發(fā)人員會用基準(zhǔn)測試來測試不同的并發(fā)模式, 或者用基準(zhǔn)測試來輔助配置工作池的數(shù)量, 以保證能最大化系統(tǒng)的吞吐量.
7. A/B測試
A/B測試选脊,是用兩組及以上隨機分配的、數(shù)量相似的樣本進行對比脸甘,如果實驗組和對比組的實驗結(jié)果相比恳啥,在目標(biāo)指標(biāo)上具有統(tǒng)計顯著性,那就可以說明實驗組的功能可以導(dǎo)致你想要的結(jié)果丹诀,從而幫你驗證假設(shè)或者做出產(chǎn)品決定钝的。
8. 代碼覆蓋測試
代碼覆蓋(Code coverage)是軟件測試中的一種度量,描述程式中源代碼被測試的比例和程度铆遭,所得比例稱為代碼覆蓋率硝桩。在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo)枚荣,甚至碗脊,用代碼覆蓋率來考核測試任務(wù)完成情況,比如橄妆,代碼覆蓋率必須達到80%或 90%衙伶。于是乎,測試人員費盡心思設(shè)計案例覆蓋代碼害碾。
發(fā)布部署
1. DEV/PRO/FAT/UAT
DEV(Development environment):開發(fā)環(huán)境矢劲,用于開發(fā)人員調(diào)試使用,版本變化較大慌随。
FAT(Feature Acceptance Test environment):功能驗收測試環(huán)境卧须,用于軟件測試人員測試使用。
UAT(User Acceptance Test environment):用戶驗收測試環(huán)境儒陨,用于生產(chǎn)環(huán)境下的功能驗證花嘶,可作為預(yù)發(fā)布環(huán)境。
PRO(Production environment):生產(chǎn)環(huán)境蹦漠,正式線上環(huán)境椭员。
2. 灰度發(fā)布
灰度發(fā)布是指在升級版本過程中,通過分區(qū)控制笛园,白名單控制等方式對一部分用戶先升級產(chǎn)品特性隘击,而其余用戶則保持不變侍芝,當(dāng)一段時間后升級產(chǎn)品特性的用戶沒有反饋問題,就逐步擴大范圍埋同,最終向所有用戶開放新版本特性州叠,灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時候就可以發(fā)現(xiàn)凶赁、修改問題咧栗,以保證其影響度。
3. 回滾 (Rollback)
指的是程序或數(shù)據(jù)處理錯誤時虱肄,將程序或數(shù)據(jù)恢復(fù)到上一次正確狀態(tài)(或者是上一個穩(wěn)定版本)的行為致板。
最后
歡迎大家有興趣的可以關(guān)注我的公眾號【java小瓜哥的分享平臺】,文章都會在里面更新咏窿,還有各種java的資料都是免費分享的斟或。