點選上方“芋道原始碼”,選擇“置頂公眾號”
技術文章第一時間送達!
原始碼精品專欄
文末老艿艿做了一個小小的投票,一起來統計下,你在哪個段位。
1. I/O最佳化
-
增加快取,減少磁碟的訪問次數。
-
最佳化磁碟的管理系統,設計最優的磁碟方式策略,以及磁碟的定址策略,這是在底層作業系統層面考慮的。
-
設計合理的磁碟儲存資料塊,以及訪問這些資料庫的策略,這是在應用層面考慮的。例如,我們可以給存放的資料設計索引,透過定址索引來加快和減少磁碟的訪問量,還可以採用非同步和非阻塞的方式加快磁碟的訪問速度。
-
應用合理的RAID策略提升磁碟I/O。
2. Web前端調優
-
減少網路互動的次數(多次請求合併)
-
減少網路傳輸資料量的大小(壓縮)
-
儘量減少編碼(儘量提前將字元轉化為位元組,或者減少從字元到位元組的轉化過程。)
-
使用瀏覽器快取
-
減少Cookie傳輸
-
合理佈局頁面
-
使用頁面壓縮
-
延遲載入頁面
-
CSS在最上面,JS在最下麵
-
CDN
-
反向代理
-
頁面靜態化
-
異地部署
3.服務降級
拒絕服務和關閉服務
4.冪等性設計
有些服務天然具有冪等性,比如講使用者性別設定為男性,不管設定多少次,結果都一樣。但是對轉賬交易等操作,問題就會比較複雜,需要透過交易編號等資訊進行服務呼叫有效性校驗,只有有效的操作才能繼續執行。
(註:冪等性是系統的介面對外一種承諾(而不是實現), 承諾只要呼叫介面成功, 外部多次呼叫對系統的影響是一致的. 宣告為冪等的介面會認為外部呼叫失敗是常態, 並且失敗之後必然會有重試.)
5.失效轉移
若資料伺服器叢集中任何一臺伺服器宕機,那麼應用程式針對這臺伺服器的所有讀寫操作都需要重新路由到其他伺服器,保證資料訪問不會失敗,這個過程叫失效轉移。
失效轉移包括:失效確認(心跳檢測和應用程式訪問失敗報告)、訪問轉移、資料恢復。
失效轉移保證當一個資料副本不可訪問時,可以快速切換訪問資料的其他副本,保證系統可用。
6.效能最佳化
根據網站分層架構,效能最佳化可分為:web前端效能最佳化、應用伺服器效能最佳化、儲存伺服器效能最佳化。
-
web前端效能最佳化
-
瀏覽器訪問最佳化:減少http請求;使用瀏覽器快取;啟用壓縮;css放在頁面最上面、javaScript放在頁面最下麵;減少Cookie傳輸
-
CDN加速
-
反向代理
應用伺服器效能最佳化
-
分散式快取(Redis等)
-
非同步操作(訊息佇列)
-
使用叢集(負載均衡)
-
程式碼最佳化
儲存效能最佳化
-
機械硬碟vs固態硬碟
-
B+樹 vs LSM樹
-
RAID vs HDFS
7. 程式碼最佳化
-
多執行緒(Q:怎麼確保執行緒安全?無鎖機制有哪些?)
-
資源復用(單例樣式,連線池,執行緒池)
-
資料結構
-
垃圾回收
8. 負載均衡
-
HTTP重定向負載均衡
當使用者發來請求的時候,Web伺服器透過修改HTTP響應頭中的Location標記來傳回一個新的url,然後瀏覽器再繼續請求這個新url,實際上就是頁面重定向。透過重定向,來達到“負載均衡”的標的。例如,我們在下載PHP原始碼包的時候,點選下載連結時,為瞭解決不同國家和地域下載速度的問題,它會傳回一個離我們近的下載地址。重定向的HTTP傳回碼是302。
優點:比較簡單。
缺點:瀏覽器需要兩次請求伺服器才能完成一次訪問,效能較差。重定向服務自身的處理能力有可能成為瓶頸,整個叢集的伸縮性國模有限;使用HTTP302響應碼重定向,有可能使搜尋引擎判斷為SEO作弊,降低搜尋排名。 -
DNS域名解析負載均衡
DNS(Domain Name System)負責域名解析的服務,域名url實際上是伺服器的別名,實際對映是一個IP地址,解析過程,就是DNS完成域名到IP的對映。而一個域名是可以配置成對應多個IP的。因此,DNS也就可以作為負載均衡服務。
事實上,大型網站總是部分使用DNS域名解析,利用域名解析作為第一級負載均衡手段,即域名解析得到的一組伺服器並不是實際提供Web服務的物理伺服器,而是同樣提供負載均衡服務的內部伺服器,這組內部負載均衡伺服器再進行負載均衡,將請求分發到真是的Web伺服器上。
優點:將負載均衡的工作轉交給DNS,省掉了網站管理維護負載均衡伺服器的麻煩,同時許多DNS還支援基於地理位置的域名解析,即會將域名解析成舉例使用者地理最近的一個伺服器地址,這樣可以加快使用者訪問速度,改善效能。
缺點:不能自由定義規則,而且變更被對映的IP或者機器故障時很麻煩,還存在DNS生效延遲的問題。而且DNS負載均衡的控制權在域名服務商那裡,網站無法對其做更多改善和更強大的管理。 -
反向代理負載均衡
反向代理服務可以快取資源以改善網站效能。實際上,在部署位置上,反向代理伺服器處於Web伺服器前面(這樣才可能快取Web相應,加速訪問),這個位置也正好是負載均衡伺服器的位置,所以大多數反向代理伺服器同時提供負載均衡的功能,管理一組Web伺服器,將請求根據負載均衡演演算法轉發到不同的Web伺服器上。Web伺服器處理完成的響應也需要透過反向代理伺服器傳回給使用者。由於web伺服器不直接對外提供訪問,因此Web伺服器不需要使用外部ip地址,而反向代理伺服器則需要配置雙網絡卡和內部外部兩套IP地址。
優點:和反向代理伺服器功能整合在一起,部署簡單。
缺點:反向代理伺服器是所有請求和響應的中轉站,其效能可能會成為瓶頸。 -
LVS-NAT:修改IP地址
-
LVS-TUN: 一個IP報文封裝在另一個IP報文的技術。
-
LVS-DR:將資料幀的MAC地址改為選出伺服器的MAC地址,再將修改後的資料幀在與伺服器組的區域網上傳送。
9.快取
快取就是將資料存放在距離計算最近的位置以加快處理速度。快取是改善軟體效能的第一手段,現在CPU越來越快的一個重要因素就是使用了更多的快取,在複雜的軟體設計中,快取幾乎無處不在。大型網站架構設計在很多方面都使用了快取設計。
-
CDN: 及內容分髮網路,部署在距離終端使用者最近的網路服務商,使用者的網路請求總是先到達他的網路服務商哪裡,在這裡快取網站的一些靜態資源(較少變化的資料),可以就近以最快速度傳回給使用者,如影片網站和入口網站會將使用者訪問量大的熱點內容快取在CDN中。
-
反向代理:反向代理屬於網站前端架構的一部分,部署在網站的前端,當使用者請求到達網站的資料中心時,最先訪問到的就是反向代理伺服器,這裡快取網站的靜態資源,無需將請求繼續轉發給應用伺服器就能傳回給使用者。
-
本地快取:在應用伺服器本地快取著熱點資料,應用程式可以在本機記憶體中直接訪問資料,而無需訪問資料庫。
-
分散式快取:大型網站的資料量非常龐大,即使只快取一小部分,需要的記憶體空間也不是單機能承受的,所以除了本地快取,還需要分散式快取,將資料快取在一個專門的分散式快取叢集中,應用程式透過網路通訊訪問快取資料。
使用快取有兩個前提條件,一是資料訪問熱點不均衡,某些資料會被更頻繁的訪問,這些資料應該放在快取中;二是資料在某個時間段內有效,不會很快過期,否則快取的資料就會因已經失效而產生臟讀,影響結果的正確性。網站應用中,快取處理可以加快資料訪問速度,還可以減輕後端應用和資料儲存的負載壓力,這一點對網站資料庫架構至關重要,網站資料庫幾乎都是按照有快取的前提進行負載能力設計的。
10. 負載均衡演演算法
-
輪詢 Round Robin
-
加強輪詢 Weight Round Robin
-
隨機 Random
-
加強隨機 Weight Random
-
最少連線 Least Connections
-
加強最少連線
-
源地址雜湊 Hash
其他演演算法
最快演演算法(Fastest):傳遞連線給那些響應最快的伺服器。當其中某個伺服器發生第二到第7 層的故障,BIG-IP 就把其從伺服器佇列中拿出,不參加下一次的使用者請求的分配,直到其恢復正常。
觀察演演算法(Observed):連線數目和響應時間以這兩項的最佳平衡為依據為新的請求選擇伺服器。當其中某個伺服器發生第二到第7 層的故障,BIG-IP就把其從伺服器佇列中拿出,不參加下一次的使用者請求的分配,直到其恢復正常。
預測演演算法(Predictive):BIG-IP利用收集到的伺服器當前的效能指標,進行預測分析,選擇一臺伺服器在下一個時間片內,其效能將達到最佳的伺服器相應使用者的請求。(被BIG-IP 進行檢測)
動態效能分配演演算法(Dynamic Ratio-APM):BIG-IP 收集到的應用程式和應用伺服器的各項效能引數,動態調整流量分配。
動態伺服器補充演演算法(Dynamic Server Act.):當主伺服器群中因故障導致數量減少時,動態地將備份伺服器補充至主伺服器群。
服務質量演演算法(QoS):按不同的優先順序對資料流進行分配。
服務型別演演算法(ToS): 按不同的服務型別(在Type of Field中標識)負載均衡對資料流進行分配。
規則樣式演演算法:針對不同的資料流設定導向規則,使用者可自行
11. 擴充套件性和伸縮性的區別
擴充套件性:指對現有系統影響最小的情況下,系統功能可持續擴充套件或替身的能力。表現在系統基礎設施穩定不需要經常變更,應用之間較少依賴和耦合,對需求變更可以敏捷響應。它是系統架構設計層面的開閉原則(對擴充套件開放,對修改關閉),架構設計考慮未來功能擴充套件,當系統增加新功能時,不需要對現有系統的結構和程式碼進行修改。
衡量網站架構擴充套件性好壞的主要標準就是在網站增加新的業務產品時,是否可以實現對現有產品透明無影響,不需要任何改動或者很少改動既有業務功能就可以上線新產品。不同產品之間是否很少耦合,一個產品改動對其他產品無影響,其他產品和功能不需要受牽連進行改動。
伸縮性:所謂網站的伸縮性指是不需要改變網站的軟硬體設計,僅僅透過改變部署的伺服器數量就可以擴大或者縮小網站的服務處理能力。
指系統能夠增加(減少)自身資源規模的方式增強(減少)自己計算處理事務的能力。如果這種增減是成比例的,就被稱作線性伸縮性。在網站架構中,通常指利用叢集的方式增加伺服器數量、提高系統的整體事務吞吐能力。
衡量架構伸縮性的主要標準就是可以用多臺伺服器構建叢集,是否容易向叢集中新增新的伺服器。加入新的伺服器後是否可以提供和原來服務無差別的服務、叢集中的可容納的總的伺服器數量是否有限制。
12.分散式快取的一致性hash
具體演演算法過程:先構造一個長度為2^32的整數環(這個環被稱作一致性Hash環)根據節點名稱的Hash值(其分佈範圍為[0,2^32 – 1])將快取伺服器階段設定在這個Hash環上。然後根據需要快取的資料的Key值計算得到Hash值(其分佈範圍也同樣為[0,2^32 – 1]),然後在Hash環上順時針查詢舉例這個KEY的hash值最近的快取伺服器節點,完成KEY到伺服器的Hash對映查詢。
最佳化策略:將每臺物理伺服器虛擬為一組虛擬快取伺服器,將虛擬伺服器的Hash值放置在Hash環上,key在換上先找到虛擬伺服器節點,再得到物理伺服器的資訊。
一臺物理伺服器設定多少個虛擬伺服器節點合適呢?經驗值:150。
13. 網路安全
-
XSS攻擊
跨站點指令碼攻擊(Cross Site Script),指駭客透過篡改網頁,註入惡意的HTML指令碼,在使用者瀏覽網頁時,控制使用者瀏覽器進行惡意操作的一種攻擊方式。
防範手段:消毒(XSS攻擊者一般都是透過在請求中嵌入惡意指令碼大道攻擊的目的,這些指令碼是一般使用者輸入中不使用的,如果進行過濾和消毒處理,即對某些html危險字元轉移,如“>”轉譯為“& gt;”);HttpOnly(防止XSS攻擊者竊取Cookie). -
註入攻擊:SQL註入和OS註入
SQL防範:預編譯陳述句PreparedStatement; ORM;避免密碼明文存放;處理好相應的異常。 -
CSRF(Cross Site Request Forgery,跨站點請求偽造)。聽起來與XSS有點相似,事實上兩者區別很大,XSS利用的是站內的信任使用者,而CSRF則是透過偽裝來自受信任使用者的請求來利用受信任的網站。
防範:httpOnly;增加token;透過Referer識別。 -
檔案上傳漏洞
-
DDos攻擊
14. 加密技術
-
摘要加密:MD5, SHA
-
對稱加密:DES演演算法,RC演演算法, AES
-
非對稱加密:RSA
非對稱加密技術通常用在資訊保安傳輸,數字簽名等場合。
HTTPS傳輸中瀏覽器使用的數字證書實質上是經過權威機構認證的非對稱加密的公鑰。
15. 流控
-
流量丟棄
-
透過單機記憶體佇列來進行有限的等待,直接丟棄使用者請求的處理方式顯得簡單而粗暴,並且如果是I/O密集型應用(包括網路I/O和磁碟I/O),瓶頸一般不再CPU和記憶體。因此,適當的等待,既能夠替身使用者體驗,又能夠提高資源利用率。
-
透過分散式訊息佇列來將使用者的請求非同步化。
如果你對 Dubbo 感興趣,歡迎加入我的知識星球一起交流。
目前在知識星球(https://t.zsxq.com/2VbiaEu)更新瞭如下 Dubbo 原始碼解析如下:
01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽
05. 拓展機制 SPI
06. 執行緒池
07. 服務暴露 Export
08. 服務取用 Refer
09. 註冊中心 Registry
10. 動態編譯 Compile
11. 動態代理 Proxy
12. 服務呼叫 Invoke
13. 呼叫特性
14. 過濾器 Filter
15. NIO 伺服器
16. P2P 伺服器
17. HTTP 伺服器
18. 序列化 Serialization
19. 叢集容錯 Cluster
20. 優雅停機
21. 日誌適配
22. 狀態檢查
23. 監控中心 Monitor
24. 管理中心 Admin
25. 運維命令 QOS
26. 鏈路追蹤 Tracing
…
一共 60 篇++