如何構建高擴展性網站?
要內容
本書從多個方面圍繞高擴展性提出了50條建議,一個高擴展性的網站會隨著業務的發展、用戶的增加,自由的擴展架構,從而輕松的應付網站的快速發展。下面看看本書的具體內容:
化簡方程
1 不要過度的設計
過度的設計相當于給系統增加了復雜度與維護的成本。而這些過度的設計,在正常的使用中,卻沒有太大的作用。往往是設計者自己認為很重要或者錦上添花的功能,實際用處不大。
2 設計時考慮到擴展性
在設計時要遵循一下的設計原則:設計時考慮20倍的容量,實現時考慮3倍的容量,部署時考慮1.5的容量。一面項目擴大時,臨時擴展造成的困難。
3 把方案一簡再簡
應該遵循帕累托法則,20%的設計做了80%的工作,所以80%的時間,都應該放在這20%的設計上。
一個產品主要的功能其實都集中在幾個點上,把這幾個點設計好了,其他的都是些附加的功能而已。所以這核心的業務一定要保證足夠的簡潔易用。
4 減少DNS查詢
每個不同的域下的文件,加載時都需要查詢DNS。比如cnblogs.com與i.cnblogs.com就屬于不同的域。那么在查詢DNS的時候,就會查詢兩次。當業務量很大時,就會造成一定的影響。
5 盡可能減少對象
由于對象在瀏覽器訪問時,需要加載。所以可以考慮減少請求文件的數量(數量與瀏覽器并發加載數有關),把一些對象盡量的合并。比如圖標類的文件,可以合并成一個大的圖片。合理的文件數量,會加速瀏覽器的訪問加載。
6 使用同一品牌的網絡設備
由于一個http請求,可能通過很多物理設備。比如負載均衡器,交換機,路由器。所以盡量使用同一品牌的設備,會避免一些意外的情況。
分布工作
7 X軸,橫向復制
這種事最簡單的服務擴充,通過克隆或者復制實現,比如你的應用放在多個服務器上進行服務。常見的比如集群,負載均衡等等,數據庫的讀寫分離。
8 Y軸,拆分不同的東西
大型系統中,拆分不同的功能,比如注冊、購買、查詢、云盤。等等
9 Z軸,拆分不同的相似的東西
比如按照用戶的級別,或者用戶的地理位置等等拆分。
橫向擴展設計
10 設計橫向的擴展方案
擴展包括橫向、縱向。橫向就是通過復制克隆應用,利用小型機集群擴展。縱向就是提高服務器的硬件以及網絡設施。
通過很多的案例都可以發現,單純的升級硬件實現的縱向擴展,僅僅能解決一點點現實壓力。而通過橫向的集群擴展,卻能夠自由的實現伸縮。
11 采用經濟型系統
與上面的原則類似,采用高價格的服務器,并不能保證日后的良好性能。應該使用普通的小型機集群擴展。
12 橫向擴展數據中心
數據中心有很多的設計方案,比如
熱冷站配置:使用熱站提供服務,當熱站崩潰時,使用冷站繼續服務。
推薦使用多個實時站點,成本更低,動態調用。缺點是增加了運維的難度。
13 利用云技術進行設計
云計算的有點就是虛擬化,可以在業務峰值時,彈性的擴充設備。并且在日常處理用,歸還該擴展。
缺點是提高了應用于虛擬環境的耦合。后面提到利用物理設備,隔離業務,在虛擬化的云計算中,可能會對業務隔離錯誤排查造成一定的干擾。
使用正確的工具
14 合理使用數據庫
目前有許多的數據庫版本,比如傳統的關系型數據庫Oracle、MySQl,還有比較新的非關系型數據庫NoSql,比如MongoDB,以及內存數據庫FastDB,還有專門針對SSD固態硬盤的Aerospike等等。
但是到了選型的時候,還是要一句個人的業務需求來定。看你的數據庫要求的是速度,還是安全性等等。
15 防火墻,到處都是防火墻
防火墻可以對一些無效的訪問進行攔截過濾。通常把一些CSS,靜態文件,圖片,JS等不采用防火墻,而關鍵的業務涉及到個人信息時采用。合理的設計防火墻,也會對網站的性能產生一定的影響。
16 積極的利用日志文件
利用各種日志以及工具,實時的監控業務。不僅僅是監控服務器的內存CPU,還應該監控業務上的數據。比如splunk(提供日志的搜集,存儲,搜索,圖形化展示)。
不要做重復的工作
17 不要立即檢查剛做過的工作
比如剛剛寫如了數據,不要立即讀取。雖然有些客戶需要保證數據的完整,不能丟失。但是可以通過日志等記錄,寫完查這種做法,還是不推薦。
18 停止重定向
重定向會消耗一定的延遲,計算資源。應該盡量避免
19 放松時序約束
大多數的關系型數據庫講究ACID屬性,擴展時就造成一定的困擾。因此某些業務適當的放松時序約束,可以提高網站的性能。
比如某站在預定酒店時,用戶預定后,會等待酒店的審核。比如某寶,在提款時,進行范圍時間的確認。這種就是擴大了時序約束,進而提高網站性能以及事務安全。
積極利用緩存
20 利用CDN
可以利用CDN保存客戶的數據和內容。大概的過程是,用戶在進行網站訪問時,轉到CDN的服務器,CDN執行DNS查詢,把用戶請求分攤到不同的服務器。有很多的CDN服務商提供這種服務。
21 使用過期頭
針對不同的對象類型,使用過期頭,減少對象請求。常見的HTTP對應屬性為:public no-cahe max-age等等
22 緩存Ajax調用
正確修改Http頭Last-Modified Cache-Control Expires等屬性。
23 利用頁面緩存
緩存響應之前的冬天請求,降低web服務器的負載。
24 利用應用緩存
比如針對某些特殊的用戶,緩存其請求數據。
25 利用對象緩存
適用于反復查詢使用的數據對象。比如一個購物網站,緩存器熱銷產品數據。
26 把對象緩存放在自己的層上
使用單獨的緩層,易于擴展和維護。
從錯誤中吸取教訓
27 積極的學習
一個公司有學習的氛圍,才會衍生出更好的產品。學習的內容一方面包括客戶的業務知識,一方面來自技術和運維領域。
28 不要依靠QA發現失誤
雇傭測試或者質量保證人員,最大的目的是為了檢測產品的正確性。它能減少成本,提高開發人員的開發速度,因為開發人員不需要時刻關注代碼的正確性,可以交給QA來測試。
但是QA只負責發現問題,如何避免為題還是得依靠開發人員。
29 沒有回退的設計是失敗的設計
這里的回退,指的是產品發布的回退。如果碰上某些版本的BUG,可能需要交付之前可運行的版本,此時沒有回退,就無法交付產品了。
這里推薦學習持續集成的相關內容。
30 討論失敗并從中吸取教訓
不應該在同一個問題上失敗兩次,每次失敗多進行總結是不可缺少的。
數據庫原則
關系型數據庫的ACID屬性:
原子性:一個事務要么全執行,要么都不執行,
一致性:事務開始和結束時,所有數據狀態要一致,
隔離性:事務的表現,是事務對數據庫唯一的操作,
持久性:事務完成,操作不能更改。
31 注意代價高的關系
應該在設計階段完善的設計表的結構,等開發開始時,在增加某些列,可能會花費很高的代價。
32 使用正確的數據庫鎖
數據庫有很多鎖的概念,比如隱式鎖、顯式鎖、行鎖、頁鎖、范圍鎖、表鎖、數據庫鎖等等。
不合理的使用鎖,會影響網站的吞吐量。
33 不要使用多階段提交
比如兩階段提交:先表決,在提交。這回降低擴展性,因為在其提交事務完成前,是不能作其他操作的。
34 不要使用select for update
因為FOR UPDATE從句會導致鎖定行,降低事務處理的速度。
35 不要選擇所有的數據
比如select * from xxx;
這種做法第一是不開與數據的擴展,比如本來有四列數據,業務處理代碼直接寫死。當增加了一列數據時,就會導致出錯;另外就是會查詢出不必要的數據。
或者inset into xxx values(xxxx);
這是當列信息不匹配時,也會出錯。
容錯設計與故障控制
36 采用隔離故障的”泳道“
服務與數據的劃分有很多種,比如容器,集群,池,分片,泳道。泳道意味著每個業務有自己的領域,不能跨泳道調用。
37 不要信任單點故障
有很多系統設計成單點模式,當整個系統只是用該模塊時,當出現單點故障,整個系統也就崩潰了。
38 避免系統串聯
比如一個系統有很多的組件組成,每個組件99.9%的安全性,當串聯3個組件時,整個系統的可用性就變成了99.7%。
39 確保能夠啟用/禁用功能
對于某些共享庫,第三方服務,應該提供開啟或者關閉的功能。
避免或分發狀態
40 努力實現無狀態
實現狀態會限制擴展性,增大成本
41 盡可能在瀏覽器端維護會話
一方面降低服務器壓力,另一方面任何的請求可以發送給任何的服務器。
42 利用分布式緩存存放狀態
使用獨立的緩存層,利于擴展。有很多分布式的緩存方案,比如memcached。
異步通信和消息總線
43 盡可能使用異步通信
異步通信,可以確保每個服務和層之間的獨立性,這樣易于早呢更加系統的擴展性和減小耦合度。
44 確保消息總線能夠擴展
盡量采用Y軸或者Z軸擴展,即按業務需求和功能擴展。因為單純的復制或者克隆,反而會增加各個消息訂閱者的監聽數目。按照業務隔離,可以分離業務壓力。
45 避免讓消息總線過度擁擠
衡量價值與消息的成本。
其他原則
46 慎用第三方解決方案擴展
企業如果出現問題,那么尋找第三方能夠解決燃眉之急。但是卻不是長久之計,因為解決方案的提供商有很多客戶,你的危機并不是他們的危機,所以不可能在關鍵時刻,盡職盡責。因此企業還是應該有一定的掌控力(這個詞真是高大上!)。
47 清除、歸檔和成本合理的存儲
有一些不必要的數據,就應該定期的刪除。一些略有價值的數據進行定期的歸檔直接刪除。一些很有價值的數據,應該進行備份以及快速訪問。
48 刪除事務處理中的商業智能
應該把產品系統與業務系統分離,提高產品的擴展性。
避免業務擴展時,受到系統架構的限制。
49 設計能夠監控的應用
應該設計全局的監控策略,保證回答
”發生了 問題了嗎?“
”哪里發生了問題?“
”發生了什么問題?“
”會發生問題嗎?“
”能自動修復嗎?“
50 要能勝任
應該在每個設計中涉及到最優秀的架構,不能完全依賴第三方的解決方案。
一個簡單優秀的架構,都是小而精的,如果單純的依靠開源解決架構,雖然解決了問題,卻會導致應用的臃腫。
參考
【1】《高擴展性網站的50條原則》
如果本文對你有幫助,別忘記給我個3連 ,點贊,轉發,評論,
咱們下期見!學習更多JAVA知識與技巧,關注與私信博主(666)
- 本樣式對齊文本text-align屬性用于指定文本塊的對齊方式,可選值包括: 1)start:內容對齊開始邊界,默認; 2)end:內容對齊結束邊界; 3)left:內容左對齊; 4)right:內容右對齊; 5)center:內容居中對齊; 6)justify:內容兩端對齊。當text-align屬性使用了justify值時,可以使用text-justify屬性指定文本添加空白的方式,這個屬性...
- 了解了包的概念,就可以系統的介紹Java中的訪問控制級別。在Java中,針對類、成員方法和屬性提供了四種訪問級別,分別是private、default、protected和public。 權限訪問修飾符(權限從大到小依次往右排) public(公共) protected(受保護) default(缺省) private(私有) 同一個類 √ √...
- Rust 提供了代碼封裝的機制。可以通過crate (等同于Java中的package)創建相對獨立的module模塊,模塊中封裝了可以重復使用的功能函數。當創建了自己的 lib 庫或者要使用第三方的庫的時候(這些庫就是一些事先寫好的crate)需要將這些庫中的module 模塊引用到當前的環境中。Rust提供了以下幾種引用方式:一、使用 extern crate在使用這些Module的文件中,通過...
- 填空題: 他______犧牲生命_______出賣組織? 據數據統計,不同年代的同學回復的最多的是….. 60后,他寧可犧牲生命,也不出賣組織。 70后,他害怕犧牲生命,所以出賣組織。 80后,他與其犧牲生命,不如出賣組織。 90后,他即使犧牲生命,也要出賣組織。 00后,他白白犧牲了生命,忘了出賣組織。 上邊的案例,引發了大家對”自我與企業關系的思考”. 能力與欲望...
- 歷屆試題 國王的煩惱 時間限制:1.0s 內存限制:256.0MB 問題描述 C國由n個小島組成,為了方便小島之間聯絡,C國在小島間建立了m座大橋,每座大橋連接兩座小島。兩個小島間可能存在多座橋連接。然而,由于海水沖刷,有一些大橋面臨著不能使用的危險。 如果兩個小島間的所有大橋都不能使用,則這兩座小島就不能直接到達了。然而,只要這兩座...
- go test命令參數問題在使用go test對go代碼進行單元測試的時候,遇到關于命令參數的問題,google了一下,沒有找到很好的說明,其實就是一些細節而已。問題是這樣的,在進行單元測試的時候,我希望輸入一些命令行參數來控制程序的運行。 參考go官方文檔,只需要在go test后面加上-args和參數就可以了 例如 go test -args -classpath E:\testcase...
- 阿里云OSS-使用經驗總結,存儲,賬號-權限,分頁,縮略圖,賬號切換最近項目中,需要使用云存儲,最后選擇了阿里云-對象存儲服務OSS。總的來說,比較簡單,但是仍然遇到了幾個問題,需要總結下。1.OSS總的使用介紹 https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_object.html?spm=5176.docoss/...
- WEB應用圖片的格式,以及各自的特點和優化(一) by FungLeo前言12年前我入行三天.用table布局做了一個非常粗糙的網頁.我說了一句話,”網頁就是表格加文字加圖片,圖片分兩種,插入圖片和背景圖片”.這句話在今天看來,當然是一個笑話.但是當時我說出這句話的時候,當時的那些前輩都非常認可我的總結,并且認為我很有從事網絡發展的潛力啊.哎,要不是他們的鼓勵,說不定我早轉行了……扯遠了.說回正題,...
- 1. 單表數據的導出針對單表數據的導出操作,MongoDB 提供了 mongoexport 命令。mongoexport 既可以將數據導出為 CSV 格式的文件,也可以導出 JSON 格式的文件。這兩者之間的區別是:JSON 是 mongoexport 默認的導出格式,不需要指定,而要導出 CSV 格式的話需要明確指定;導出 CSV 格式必須顯式指定各屬性名,而導出 JSON 格式不需要。由此可見...
- 商業智能對于中小企業來說,由于其高昂的費用和運行維護技術水平要求高,往往難以承受,商業智能SAAS系統平臺+模塊的創新模式的出現能幫助中小企業走上商業智能之路。...
- stack.sh給出了一個非常好的例子,關于學習openstack創建 1.檢查devstack文件,檢查bash4.2以上,檢查用戶,不能是root2.準備環境,導入函數3.檢查local.conf和localrc是否都存在,如果存在使用localrc4.檢查是否已經運行devstack5.代理設置和禁用無效服務6.配置sudo7.配置distro庫8.配置目標目錄,創建目標目錄9.配置主機、日...
- 博客地址:http://blog.csdn.net/FoxDave本文介紹如何利用SharePoint客戶端對象模型(.NET)逐級獲取Office 365網站中List的內容,僅僅是示例,沒有講究太多東西。代碼如下:ClientContext ctx=new ClientContext(""); ctx.Credentials=new SharePointOn...
- 題外話Atom,風風雨雨走過一年多了.,目前最新版本是V1.7.0 .社區還是相當活躍;體驗也改善了很多;但是性能上還是欠缺;今天我再來介紹自己常用的一款插件git-control插件介紹 官方介紹頁面 作者: jacogr Github地址 我的介紹 就是命令行的GUI版本,,有些類似sourcetree,但是不如它強大,日用滿足使用在編輯器下加載git版本的工作目錄;工具默認啟用快捷鍵...
- 安裝devstack后,如果沒有設置參數,執行openstack命令是不成功的。1.登錄到horizon頁面,使用admin登入,進入project->compute-> Access&Security -> API Access,記錄下Service Endpoint。或選擇download OpenStack RC File按鈕,下載demo-openrc.sh文件2.將demo-openrc...
- 對于這樣的問題,看到第一眼就是暴力破解,所以也就遞歸找到所有情況,再篩選出合格的小明被劫持到X賭城,被迫與其他3人玩牌。 一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。 這時,小明腦子里突然冒出一個問題: 如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先后順序,自己手里能拿到的初始牌型組合一共有多少種呢?思路: 首先無論怎么取,手牌為13張的時候結束.也就是遞歸結束標...
- 網紅和粉絲經濟,是最近幾年流行起來的概念。 截至目前,有一些初步的認識,整理成文。 粉絲,最早是明星的跟隨者比較多。 我的理解是,對于一個人物、動物、運動等,有著共同的興趣,從而建立多個人和一個人之間的關系,比如粉絲和明星。 粉絲經濟,大獲成功的標志是,雷軍和小米科技。在創業早期,就把粉絲經濟和社交傳播結合在一起,低成本地實現了全網營銷。從此以后,各大手機廠商等很多領域的企業,都...
- 關于android端apk退出方式的設計,現在大體只有下面幾種:1,有退出和取消按鈕;2,一定時間內兩次返回為退出;3,一次返回就是退出。首先可以看到這兩個用按鈕的,退出都在左側,設計者肯定沒有看過十年前雅虎研究院出的web端設計指導,下一步的操作一定是在右側,而返回上一步的操作是在左側。但是到了移動端應該考慮用戶是左手還是右手使用,也就是說,如果是左手使用,這個位置設計沒有問題,反之就不用說了。...
- 寫在最前:本文主要描述在網站的不同的并發訪問量級下,Mysql架構的演變可擴展性架構的可擴展性往往和并發是息息相關,沒有并發的增長,也就沒有必要做高可擴展性的架構,這里對可擴展性進行簡單介紹一下,常用的擴展手段有以下兩種Scale-up : 縱向擴展,通過替換為更好的機器和資源來實現伸縮,提升服務能力Scale-out : 橫向擴展, 通過加節點(機器)來實現伸縮,提升服務能力對于互聯網的高并...
- angular.js中,指令是最基礎的也是最重要的工具之一。angular.js指令指的是以ng為前綴的HTML屬性。在之前的ng-app、ng-model等,都屬于指令。 angular.js中的基本指令包括如下內容: · 1.ng-app/ng-model ng-app指令用于聲明angular,js的作用范圍,ng-model用于聲明模型。這些在之前都已經進行過詳細介紹。 2.ng-...
- java編碼 當你的字節序列是某種編碼時,這個時候想把字節序列變成 字符串,也需要用這種編碼方式,否則會出現亂碼 文本文件就是字節序列 可以是任意編碼的序列,如果在中文機器上直接創建文本文件,那么該文本文件 只認識ANSI編碼 案例: public class Bianma { public static void main(Strin...
- 調試JDK源碼-一步一步看HashMap怎么Hash和擴容調試JDK源碼-ConcurrentHashMap實現原理調試JDK源碼-HashSet實現原理調試JDK源碼-調試JDK源碼-Hashtable實現原理以及線程安全的原因 ConcurrentHashMap線程安全的總結是我從源碼分析出來的:ConcurrentHashMap所謂線程安全是哈希沖突的時候新增的節點是線程安全的,而 Conc...
- 對于后臺系統的搜索進行UI自動化,主要是比對頁面查詢結果是否與預期一致(即數據庫查詢結果) search.py# -*- coding:utf8 -*- import HTMLTestRunner import time import unittest import public from selenium import webdriver class Search(unittest.TestCa...
- ajax 的全稱是Asynchronous(異步的意思) JavaScript and XML,是一種創建交互式網頁應用的網頁開發技術 ajax技術的流行得益于google的大力推廣,正是由于google產品對ajax技術的廣泛應用,使得ajax流行起來了。 Ajax其核心有JavaScript、XMLHTTPRequest、DOM對象組成,通過XmlHttpRequest對象來向服務器發異步請求,從服務器獲得數據,然后用JavaScript來操作DOM而更新頁面。這其中最關鍵的一步就是從服務器獲得請...
- 一、SpringMVChttp://blog.csdn.net/evankaka/article/details/45501811Spring Web MVC是一種基于Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基于請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡...
- 概念: 優化策略:字段選擇性 選擇性較低索引 可能帶來的性能問題索引選擇性=索引列唯一值/表記錄數;選擇性越高索引檢索價值越高,消耗系統資源越少;選擇性越低索引檢索價值越低,消耗系統資源越多;查詢條件含有多個字段時,不要在選擇性很低字段上創建索引可通過創建組合索引來增強低字段選擇性和避免選擇性很低字段創建索引帶來副作用;盡量減少possible_keys,正確索引會提高sql查詢速度,過多索引...
- 一. 什么是Spark? Spark是UC Berkeley AMP lab所開源的類Hadoop MapReduce的通用的并行計算框架,Spark基于map reduce算法實現的分布式計算,擁有Hadoop MapReduce所具有的優點;但不同于MapReduce的是Job中間輸出和結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用于數據挖掘與機器學習等需...
- 相比之前的增改查,刪除就顯得簡單的多了。 這里的request的type為delete,刪除成功的status為204,404則是要刪除的記錄不存在 var id='BAD90A95-7FEA-E511-9414-ADA183AB6249'; $.ajax({ async: false, type: "DELETE ", co...
- 關于JPush極光推送是國內的服務廠商提供的一站式push服務(同時支持iOS、android),后面也加入了即時通訊的能力供app使用。致力于打造簡單、可靠、價格有競爭力的服務(簡單功能全免費,高級版才收費),讓應用開發商可以聚焦業務開發,push相關的技術實現全部通過極光推送來解決,僅需調用極光推送的api即可。正因為如此,開發者小伙伴們對其的評價相當不錯。筆者的app新增了從服務器往移動客戶端...
- Mapreduce初析 Mapreduce是一個計算框架,既然是做計算的框架,那么表現形式就是有個輸入(input),mapreduce操作這個輸入(input),通過本身定義好的計算模型,得到一個輸出(output),這個輸出就是我們所需要的結果。 重點就是這個計算模型的運行規則。在運行一個mapreduce計算任務時候,任務過程被分為兩個階段:map階段...
- Jquery對象常用的方法:$(”p”).addClass(css中定義的樣式類型); 給某個元素添加樣式 $(”img”).attr({src:”test.jpg”,alt:”test Image”}); 給某個元素添加屬性/值,參數是map $(”img”).attr(”src”,”test.jpg”); 給某個元素添加屬性/值 $(”img”).attr(”title”, function(...
>同理,橫向行統計時輸入=SUM(FILTER(DROP($B$2:$O$9,-1,-2),COLUMN(DROP($B$2:$O$9,-1,-2))=COLUMN()))后橫拉,公式COLUMN(DROP($B$2:$O$9,-1,-2))=COLUMN())的作用就是條件,為當前列的數據即B2:B8,FILTER 函數是提取滿足條件的數據,SUM函數是對數據求和。