前段時間讀了《大型技術(shù)架構(gòu)》一書,現(xiàn)把書中的要點(diǎn)記錄下來。
- 網(wǎng)站架構(gòu)模式:分層(單一職責(zé),MVC分層,控制層-服務(wù)層-數(shù)據(jù)層),分割(不同功能與服務(wù)分割),分布式(服務(wù)調(diào)用需要通過網(wǎng)絡(luò),帶來了網(wǎng)絡(luò)問題;分布式數(shù)據(jù)一致性問題),集群,緩存,異步,冗余(冷備份,熱備份),自動化,安全。
- 常用的分布式方案:分布式應(yīng)用與服務(wù);分布式靜態(tài)資源(動靜分離JS,CSS,圖片等,減輕應(yīng)用服務(wù)器的負(fù)載壓力);分布式數(shù)據(jù)與存儲(讀寫分離;分庫分表;緩存優(yōu)化;傳統(tǒng)數(shù)據(jù)庫分布式部署;使用NoSQL);分布式計算。
- 緩存:CDN(內(nèi)容分發(fā),部署在離用戶最近的網(wǎng)絡(luò)服務(wù)商),反向代理(部署在網(wǎng)站的數(shù)據(jù)中心),本地緩存(緩存在本機(jī)內(nèi)存中,但是不適合大量的數(shù)據(jù)),分布式緩存(分布式緩存集群)。熱點(diǎn)數(shù)據(jù)緩存,注意緩存的時間,避免出現(xiàn)數(shù)據(jù)臟讀,影響數(shù)據(jù)一致性。
- 異步:單一服務(wù)器可以通過多線程共享內(nèi)存隊(duì)列的方式實(shí)現(xiàn);分布式系統(tǒng)中可以通過分布式消息隊(duì)列實(shí)現(xiàn)。典型的模型就是生產(chǎn)者-消費(fèi)者模式,兩者之間不存在直接調(diào)用,只是保持?jǐn)?shù)據(jù)結(jié)構(gòu)不變。作用:提高網(wǎng)站可用性;加快網(wǎng)站響應(yīng)速度;消除并發(fā)訪問高峰。
- 性能問題,網(wǎng)站響應(yīng)速度慢,優(yōu)化措施:通過瀏覽器緩存,頁面壓縮等;使用CDN,動靜分離,部署反向代理服務(wù)器,緩存熱點(diǎn)文件;使用本地緩存與分布式緩存;使用消息隊(duì)列,異步處理請求;代碼層面使用多線程,內(nèi)存管理等進(jìn)行優(yōu)化;數(shù)據(jù)庫方面使用索引,緩存,優(yōu)化SQL,讀寫分離等。
- 可用性:網(wǎng)站高可用的主要手段就是冗余,通過負(fù)載均衡服務(wù)器統(tǒng)一一個集群對外提供服務(wù),有效的負(fù)載均衡策略;數(shù)據(jù)服務(wù)器進(jìn)行實(shí)時備份,宕機(jī)時進(jìn)行數(shù)據(jù)轉(zhuǎn)移并恢復(fù)。
- 網(wǎng)站可擴(kuò)展性的主要手段是事件驅(qū)動架構(gòu)和分布式服務(wù)。事件驅(qū)動通常將請求構(gòu)造成消息發(fā)布到消息隊(duì)列之中,消息處理者通過消息隊(duì)列中獲取消息進(jìn)行處理。分布式服務(wù)是將業(yè)務(wù)與基礎(chǔ)服務(wù)分離開來。
- 性能優(yōu)化策略:首先要進(jìn)行性能數(shù)據(jù)的搜集,然后針對性能報告進(jìn)行性能分析,檢查請求處理的各個環(huán)節(jié)的日志信息,分析是哪個環(huán)節(jié)響應(yīng)時間較長,檢查監(jiān)控數(shù)據(jù),分析影響性能的是硬件設(shè)施(內(nèi)存,磁盤,CPU,網(wǎng)絡(luò))還是代碼問題還是架構(gòu)設(shè)計不合理,亦或是系統(tǒng)資源不足等。找到問題的原因后再針對不同的問題進(jìn)行相應(yīng)的優(yōu)化。
- 瀏覽器訪問優(yōu)化:減少http請求(合并CSS,JS文件,圖片等),http協(xié)議是無狀態(tài)的應(yīng)用層協(xié)議,意味著每次http請求都需要建立通信鏈路,進(jìn)行數(shù)據(jù)傳輸。使用瀏覽器緩存(設(shè)置http的頭字段)。啟用壓縮(對html,css,js文件進(jìn)行GZIP壓縮)
- 網(wǎng)站優(yōu)化第一定律:優(yōu)先考慮使用緩存優(yōu)化性能。
- 緩存的基本原理:緩存指的是將數(shù)據(jù)存儲在相對較高訪問速度的存儲介質(zhì)中,減少數(shù)據(jù)訪問的時間。緩存的本質(zhì)是一個內(nèi)存Hash表,數(shù)據(jù)緩存以一對Key,Value的形式存儲在內(nèi)存Hash表中。Hash表數(shù)據(jù)讀寫的時間復(fù)雜度為O(1)。緩存中主要用來存放讀寫比較高,很少變化的數(shù)據(jù),應(yīng)用程序先讀寫緩存,緩存中沒有或者數(shù)據(jù)失效再去數(shù)據(jù)庫中查詢,并將查詢到的數(shù)據(jù)寫入緩存。緩存要考慮數(shù)據(jù)一致性問題與臟讀。可以設(shè)置策略是數(shù)據(jù)更新后馬上更新緩存。緩存雪崩問題通過分布式緩存解決。
- 分布式緩存:緩存部署在多個服務(wù)器組成的集群上。兩種緩存架構(gòu)方式:JBoss Cache為代表的需要更新同步的分布式緩存;以Memcached為代表的不互相通信的分布式緩存。
- JBoss Cache的分布式緩存在集群中的所有服務(wù)器上都保存相同的緩存數(shù)據(jù),當(dāng)某臺服務(wù)器緩存更新時,會通知集群中所有的機(jī)器進(jìn)行緩存更新或清除緩存。一般會將JBoss Cache與應(yīng)用程序部署在同一服務(wù)器上。
- Memcached采用的是集中式的緩存管理,緩存與應(yīng)用分離部署,緩存系統(tǒng)部署在專門的集群上,應(yīng)用程序通過一致性hash等路由算法選擇緩存服務(wù)器遠(yuǎn)程訪問緩存數(shù)據(jù),緩存服務(wù)器之間不通信。這樣緩存集群可以很簡單的實(shí)現(xiàn)擴(kuò)容,具備良好的可伸縮性。采用的是TCP協(xié)議(UDP也支持)通信,序列化協(xié)議是通過基于文本的自定義協(xié)議。服務(wù)端和客戶端,采用memcached協(xié)議交互。
- ①負(fù)載均衡+session復(fù)制,將session同步至每個應(yīng)用服務(wù)器,保證服務(wù)的狀態(tài)。②session綁定,利用負(fù)載均衡的源地址hash算法實(shí)現(xiàn)將來源于同一IP的請求始終分發(fā)到同一臺應(yīng)用服務(wù)器上。③利用瀏覽器的cookie記錄下session以及sessionID,將session以及sessionID發(fā)送給負(fù)載均衡器,負(fù)載均衡服務(wù)器根據(jù)sessionID將請求轉(zhuǎn)發(fā)至相應(yīng)的應(yīng)用服務(wù)器。④設(shè)置專門的session服務(wù)器統(tǒng)一管理session,應(yīng)用程序每次讀寫session都通過session服務(wù)器。
- 負(fù)載均衡算法:輪詢:請求依次分發(fā)到每臺應(yīng)用服務(wù)器上;加權(quán)輪詢:根據(jù)應(yīng)用服務(wù)器的性能進(jìn)行加權(quán)重新分配;隨機(jī);最少連接:記錄每個應(yīng)用服務(wù)器正在處理的請求連接數(shù),將新的請求分配到連接數(shù)最少的服務(wù)器上;源地址散列。
- 網(wǎng)絡(luò)IO的實(shí)現(xiàn):BIO;NIO;AIO。
- BIO采用阻塞的方式實(shí)現(xiàn),也就是說一個Socket套接字需要使用一個線程來處理。支持并發(fā)的連接,需要更多的線程來完成這個工作。
- NIO基于事件驅(qū)動思想,采用的是Reactor模式。可以在一個線程中處理多個套接字Socket相關(guān)的工作。Reactor會管理所有的handler,并把出現(xiàn)的事件交給相應(yīng)的handler去處理。
- AIO就是異步IO。采用Proactor模式,AIO與NIO的區(qū)別:AIO在讀寫操作時,只需要調(diào)用相應(yīng)的read/write方法,并且需要傳入CompletionHandler;在完成動作后會調(diào)用CompletionHandler。而NIO的通知是發(fā)生在動作之前,是在可寫可讀的時候,selector發(fā)現(xiàn)這些事件后調(diào)用handler處理。
- 控制器的變化:使用硬件負(fù)載均衡——》使用軟件負(fù)載均衡(LVS)(透明代理,請求發(fā)送發(fā)和處理方都不需要知道對方,但是存在不足:增加網(wǎng)絡(luò)的開銷,比如流量和延時;代理出現(xiàn)問題則所有請求都會受到影響)——》采用名稱服務(wù)直連方式請求調(diào)用(名稱服務(wù)器是通過跟請求處理的機(jī)器交互來獲取這些機(jī)器的地址)——》采用規(guī)則服務(wù)器控制路由的請求直連調(diào)用(規(guī)則服務(wù)器本身并不和請求處理的機(jī)器進(jìn)行交互,只負(fù)責(zé)把規(guī)則提供給請求發(fā)起的機(jī)器)——》master+worker的方式(存在一個master來管理worker)
- 運(yùn)算器的變化:DNS調(diào)度——》DNS+負(fù)載均衡調(diào)度(DNS返回的永遠(yuǎn)都是負(fù)載均衡設(shè)備的地址)
- 存儲器的變化:單機(jī)的Key-Value服務(wù)——》使用代理服務(wù)器的多機(jī)Key-Value服務(wù)——》使用名稱服務(wù)的Key-Value服務(wù)——》使用規(guī)則服務(wù)器的Key-Value服務(wù)——》通過Master的Key-Value服務(wù)
- 分布式系統(tǒng)的難點(diǎn):①缺乏全局時鐘;②面對故障獨(dú)立性;③處理單點(diǎn)故障;④事務(wù)的挑戰(zhàn)
- 數(shù)據(jù)庫讀寫分離:兩個問題:數(shù)據(jù)復(fù)制問題(使用數(shù)據(jù)庫本身提供的數(shù)據(jù)復(fù)制機(jī)制,但還是存在復(fù)制延時的數(shù)據(jù)不一致性問題);應(yīng)用對于數(shù)據(jù)源的選擇問題(寫操作要走主庫,事務(wù)中的讀操作也要走主庫)
- 搜索引擎技術(shù)解決大型網(wǎng)站站內(nèi)搜索時的某些場景下的讀的問題,提供了更好的查詢效率,站內(nèi)搜索結(jié)構(gòu)和使用讀庫非常相似,只是多了自己建立數(shù)據(jù)索引的步驟。
- 緩存:數(shù)據(jù)緩存(全數(shù)據(jù)緩存(數(shù)據(jù)庫的數(shù)據(jù)發(fā)生變化后會把數(shù)據(jù)寫入到緩存中,保證數(shù)據(jù)不會讀取失效);熱數(shù)據(jù)緩存(應(yīng)用訪問緩存,如果數(shù)據(jù)不存在則去數(shù)據(jù)庫里讀取并把數(shù)據(jù)加入到緩存中));頁面緩存(ESI規(guī)范)
- 緩存的一個關(guān)鍵指標(biāo)緩存命中率,如果緩存命中率比較低的話就意味著有不少請求要回到數(shù)據(jù)庫中查詢。還要考慮緩存服務(wù)器的擴(kuò)容與縮容(一致性hash)以及緩存數(shù)據(jù)更新(定時失效,數(shù)據(jù)變更時失效,數(shù)據(jù)變更時更新)。
- 數(shù)據(jù)庫拆分:專庫專用,數(shù)據(jù)垂直拆分(不同業(yè)務(wù)數(shù)據(jù)拆分到不同的數(shù)據(jù)庫中);數(shù)據(jù)的水平拆分(把同一個表的數(shù)據(jù)拆分到不同的數(shù)據(jù)庫中)。
- 服務(wù)化:把應(yīng)用分為三層,處于最上端的是Web系統(tǒng),用于完成不同的業(yè)務(wù)功能;處于中間的是一些服務(wù)中心,不同的服務(wù)中心提供不同的業(yè)務(wù)服務(wù),處于下層的則是業(yè)務(wù)的數(shù)據(jù)庫同時引入了遠(yuǎn)程調(diào)用,共享代碼不再散落在各個應(yīng)用中而是放到了各個服務(wù)中心上。數(shù)據(jù)交互工作由業(yè)務(wù)服務(wù)中心完成。
- 遠(yuǎn)程過程調(diào)用和對象訪問中間件(主要解決分布式環(huán)境下應(yīng)用互相訪問的問題);消息中間件(解決應(yīng)用之間的消息傳遞,解耦以及異步問題);數(shù)據(jù)訪問中間件(主要解決應(yīng)用訪問數(shù)據(jù)庫的共性問題)
- 靜態(tài)代理與動態(tài)代理?靜態(tài)代理為每一個被代理的對象構(gòu)造對應(yīng)的代理類。動態(tài)代理是動態(tài)地生成具體委托類的代理實(shí)現(xiàn)對象,通過Proxy.newProxyInstance來創(chuàng)建代理方法可以為不同的委托類都創(chuàng)建代理類。方法調(diào)用使用invoke。
- 服務(wù)化使得原來的一些本地調(diào)用變?yōu)榱诉h(yuǎn)程調(diào)用。遠(yuǎn)程調(diào)用:獲取可用服務(wù)地址列表->確定要調(diào)用服務(wù)的目標(biāo)機(jī)器->建立連接->請求序列化->發(fā)送請求->接受結(jié)果->解析結(jié)果
1
6
0
10
0
回帖
|