設計網站時,經常需要做圖標響應,例如用戶點擊圖標,后臺響應用戶的操作。本文對圖像分區響應的設計方式進行介紹。
圖像響應一般是通過在圖像上設置超鏈接實現的,代碼示例如下:
<a href="這里寫鏈接地址 "> //設置超鏈接
<img src="圖片名稱.圖片格式" > //定義圖像
</a>
例如圖像示例如下:
圖標示例
這種情況,沒有對圖像分區處理,因此只要點擊頁面中的任意位置(包括圖像上的任意位置或者頁面的空白處),均會跳轉到對應的鏈接。
但是有時候一張圖,可能在用戶點擊不同的位置,需要不同的響應,此時需要進行分區響應,具體代碼示例如下:
<img src="圖像名稱.圖片格式" usemap="#名稱1"> //定義圖像,以及圖像的名稱
<map name="名稱1"> //引用前文中的圖像
<area href="鏈接地址1" shape="rect" coords="a1,b1,a2,b2"> //定義圖像區域的超鏈接和在圖像中的像素位置
<area href="鏈接地址2" shape="rect" coords="c1,d1,c2,d2">//同上
</map>
其中,shape表示圖像區域的形狀,例如rect/circle等等。圖像中某個圖像分區的位置可以通過前文form實現,例如:
<form>
<input type="image" src="圖像名稱.圖片格式">
</form>
當顯示圖像之后,可以點擊圖像的任意位置,此時鏈接處會顯示該點擊位置在圖像中的像素位置,例如:
像素位置
TML是一種用來描述網頁的標記性語言。學習HTML可能并不難,主要是要記一些HTML標簽和標簽代表的含義。下面PHP程序員雷雪松根據使用的情況,整理出平時常用的HTML標簽。
HTML基礎之HTML常用標簽-PHP程序員雷雪松的博客
<!--<!DOCTYPE> 是HTML5聲明,<!DOCTYPE> 必須是 HTML 文檔的第一行,位于 <html> 標簽之前。<!DOCTYPE>是指示 web 瀏覽器關于頁面使用哪個 HTML 版本進行編寫的指令。-->
<!DOCTYPE html>
<html>
<!-- head標簽是所有頭部元素的容器。head標簽內的元素可包含腳本、樣式表和提供頁面的元信息等等。以下標簽都可以添加到 head 部分:title、base、link、meta、script 以及style。頭部的內容不會顯示在瀏覽器的。 -->
<head>
<!-- 設置字符集,如果字符集不對,可能導致亂碼。一般建議utf-8國際編碼 -->
<meta http-equiv="Content-Type" content="text/html; charset=gb2312或utf-8或gbk" />
<!-- SEO相關標簽,title定義文檔的標題,百度建議一般不要超過32位,meta定義頁面關鍵詞和頁面的描述-->
<title>網頁標題</title>
<meta name="keywords" content="PHP程序員,技術博客,個人博客,雷雪松" />
<meta name="description" content="PHP程序員,雷雪松(Raykaeso)的博客是一個優秀的個人技術博客。PHP程序員雷雪松的博客記錄了Linux學習,PHP開發與編程,Web前端開發,MySQL學習和教程,NoSQL數據庫教程以及個人的人生經歷和觀點。" />
<link rel="stylesheet" type="text/css" href="main.css" />
<script type="text/javascript" src="main.js"></script>
</head>
<!-- 正文部分,所有在瀏覽器上可見的內容必須寫在body標簽內部 -->
<body>
</body>
</html>
a、布局標簽
div標簽定義文檔中的分區或節(division/section),可以把文檔分割為獨立的、不同的部分,主要用于布局。
aside標簽的內容可用作文章的側欄,<span style="color: #ff0000;">html5新增標簽</span>。
header標簽定義頁面的頭部(介紹信息),<span style="color: #ff0000;">html5新增標簽</span>。
section標簽定義文檔中的節(section、區段)。比如章節、頁眉、頁腳或文檔中的其他部分,<span style="color: #ff0000;">html5新增標簽</span>。
footer 標簽定義文檔或節的頁腳,通常包含文檔的作者、版權信息、使用條款鏈接、聯系信息等等,<span style="color: #ff0000;">html5新增標簽</span>。
article標簽規定文章獨立的其他內容,比如:標題、內容、評論,<span style="color: #ff0000;">html5新增標簽</span>。
b、文本標簽
h1-h6標簽可定義標題
p標簽定義段落
b/strong標簽加粗
em標簽來表示強調的文本,斜體
strong標簽表示重要文本
u標簽下劃線
s標簽刪除線
br標簽表示回車換行
hr標簽表示水平線
span標簽被用來組合文檔中的行內元素。
blockquote標簽表示塊引用
pre標簽可定義預格式化的文本,保持原有格式的一種標簽。
sub標簽下標,
sup>標簽上標
表示一個空格
©表示版權符
<表示<
>表示>
c、a標簽定義超鏈接,指定頁面間的跳轉。鏈接可以指向外部鏈接或者頁面內部id錨點,可以在當前頁面打開,新開窗口。
<a href="指向的鏈接地址或者網址#ID名" target="_blank|_self|_top|_parent">百度</a>
d、多媒體標簽
img標簽主要在網頁中插入圖像,可以定義圖片替換文本、顯示寬度和高度、是否帶邊框,建議等比例設置,否則圖像會變形。
<img src="圖片地址" alt="替換文本,圖片打不開的時候顯示" width="圖片寬度" height="高度" border="0" />
audio標簽定義聲音,比如音樂或其他音頻流。<span style="color: #ff0000;">html5新增標簽</span>。
<audio src="someaudio.wav">您的瀏覽器不支持 audio 標簽。</audio>
video標簽定義視頻,比如電影片段或其他視頻流。<span style="color: #ff0000;">html5新增標簽</span>。
<video src="movie.ogg" controls="controls">您的瀏覽器不支持 video 標簽。</video>
e、序列化標簽
ul和li無序列表標簽
<ul>
<li>HTML</li>
<li>JS</li>
<li>PHP</li>
</ul>
ol和li有序列表標簽,可以使用type屬性規定有序列表符號的類型。1 按數字有序排列,為默認值,(1、2、3、4);a 按小寫字母有序排列,(a、b、c、d);A 按字母大寫有序排列,(A、B、C、D)。i 按小寫羅馬字母有序,(i, ii, iii, iv);I 按小寫羅馬字母有序,(I, II, III, IV)。
<ol>
<li>HTML</li>
<li>JS</li>
<li>PHP</li>
</ol>
dl標簽定義了定義列表(definition list),dl標簽用于結合 dt(定義列表中的項目)和 dd(描述列表中的項目)。
<dl>
<dt>計算機</dt>
<dd>用來計算的儀器 ... ...</dd>
</dl>
f、表格標簽
table標簽和tr標簽,th標簽和td標簽,合并單元格。
<table width="100%" height="193" border="1" cellpadding="0" cellspacing="0" bordercolor="#FF0000" bgcolor="#000000" background="">
<tr>
<th>標題</th>
<th>標題</th>
</tr>
<tr>
<!-- 合并橫向單元格 -->
<td colspan="2" nowrap="nowrap">&nbsp;</td>
</tr>
<tr>
<td></td>
<!-- 合并縱向單元格 -->
<td rowspan="2"> </td>
</tr>
<tr>
<td height="16"> </td>
</tr>
</table>
g、表單標簽
form標簽定義提交方式、提交地址、表單字符集以及如何對其進行編碼,需要提交的表單一定要放在form標簽內。
<form id="form1" name="form1" method="post|get" enctype="multipart/form-data" action="提交到的地址"></form>
input標簽用于搜集用戶信息
<input name="userName" type="text" maxlength="5" size="100" value="asdfasdfasfd" />
密碼,輸入的字符會被掩碼(顯示為星號或原點)
<input name="pwd" type="password" maxlength="5" size="100" value="" />
文件類型的表單,上傳文件時,form表單一定要設置為enctype="multipart/form-data"
<input type="file" name="file" />
隱藏表單
<input type="hidden" name="country" value="China" />
提交
<input type="submit" name="Submit" value="提交" disabled="disabled" />
重置
<input type="reset" name="Submit2" value="重置" />
radio單選
<input name="sex" type="radio" value="1" />男
<input name="sex" type="radio" value="2" checked="checked" />女
checkbox多選
<input name="skill" type="checkbox" value="1" checked="checked" />PHP
<input name="skill" type="checkbox" value="2" />前端
<input name="skill" type="checkbox" value="2" />數據庫
<span style="color: #ff0000;">注:checked="checked"可以簡寫成checked</span>
label標簽為input元素定義標注,如果您點擊label元素文本,就會觸發此input控件。
textarea標簽,設置文本區內的可見行數和寬度
<textarea name="content" cols="30" rows="10">大段文本輸入框</textarea>
button標簽定義一個按鈕
提交按鈕
<button type="submit" value="提交">提交</button>
重置按鈕
<button type="reset" value="重置">重置</button>
select標簽和option標簽下拉列表
單選菜單列表框
<select name="user">
<option value="1">ray</option>
<option value="2" selected="selected">raykaeso</option>
</select>
多選列表下拉框,shift加鼠標單擊,可以連續選擇多個選擇,CTRL+鼠標點擊,可以點擊多個。
<select name="user" size="10" multiple="multiple">
<option value="1">雷雪松</option>
<option value="2" selected="selected">ray</option>
<option value="3">raykaeso</option>
</select>
注:selected="selected"可簡寫成selected,表示選中
a、HTML標簽和屬性是不區分大小寫的,建議HTML標簽和屬性都小寫,屬性值必須用雙引號包圍。
b、HTML標簽都是以開始標簽起始,以結束標簽終止。大部分HTML標簽都是成對出現的,稱為雙標簽,比如:p標簽、div標簽,也有的HTML標簽在開始標簽中結束的標簽,稱為單標簽,比如:hr標簽、br標簽。大多數 HTML 元素可擁有屬性,文本內容都是寫在開始標簽與結束標簽之間。
c、HTML標簽之間盡量縮進與換行,每行代碼不要過長,方便閱讀和維護。
d、HTML標簽使用必須符合標簽嵌套規則。禁止a標簽嵌套a標簽,p標簽嵌套div標簽。
e、建議不使用HTML已經廢棄的或者不贊成使用的標簽,少使用table布局、iframe框架嵌套以及flash播放器。
來源:PHP程序員雷雪松的博客 -HTML基礎之HTML常用標簽(http://www.leixuesong.cn/2045)
譯者 | 彎月
設計一個能夠支持數億用戶的系統并非易事,對軟件架構師來說是一個很大的挑戰。
以下是本文涵蓋的一些主題:
從最簡單的開始:一個服務器搞定一切。
可擴展性的藝術:向外擴展,向上擴展。
擴展關系數據庫:主從復制、主主復制、聯合、分片、反規范化和 SQL 調優。
使用哪個數據庫:NoSQL 還是 SQL?
高級概念:緩存、CDN、geoDNS.等。
本文不打算討論高性能計算中常見的問題,例如容錯、可靠性、高可用性等。
下面,我們開始。
下圖是我設計的一個最基本的應用。最簡單的方法是將整個應用程序部署在一個服務器上。這可能也是我們大多數人入門時期采用的方式。
一個網站(包括 API)在Apache(或 Tomcat)之類的Web服務器上運行。
一個Oracle(或 MySQL)之類的數據庫。
同一臺物理機器上同時擁有網絡服務器和數據庫服務器
但是,這樣的架構存在以下缺點:
如果數據庫出現故障,系統就會出現故障。
如果網絡服務器出現故障,整個系統就會出現故障。
在這種情況下,我們沒有故障轉移和冗余。一旦服務器宕機就會導致整個系統宕機。
使用 DNS 服務器解析主機名和 IP 地址
在上圖中,為了獲取托管系統的服務器IP地址,用戶(或客戶端)需要連接到 DNS系統。在獲得 IP 地址后,請求將直接發送到我們的系統。
每次訪問網站時,計算機都會執行 DNS 查找。
通常,域名系統(Domain Name System,DNS)服務器都會使用托管公司提供的付費服務,無需在自己的服務器上運行。
可擴展性的藝術
由于數據量、工作量(例如交易數量)以及用戶數量的增加等多種原因,我們的系統必須具備可擴展性。
可擴展性通常意味著能夠通過添加更多資源來處理更多用戶、客戶端、數據、事務或請求,同時還不會影響用戶體驗。
我們必須決定如何擴展系統。在我們的這個例子中,有以下兩種擴展類型:向上擴展(scale-up)和向外擴展(scale-out)。
向上擴展 vs 向外擴展
向上擴展:向現有服務器添加更多內存和 CPU
向上擴展也稱為“垂直擴展”,指的是系統的資源最大化,以擴展其處理不斷增加的負載的能力。例如,我們可以通過添加內存和CPU來增強服務器的能力。
如果我們的服務器擁有8GB內存,則只需更換或添加硬件就可以輕松升級到32GB甚至128GB。
垂直擴展的方法有很多,如下所示:
通過向 RAID 陣列添加更多硬盤來增加 I/O 容量。
通過使用固態硬盤(SSD)來改善 I/O 的訪問時間。
使用具有更多處理器的服務器。
通過升級網絡接口或安裝其他接口來提高網絡吞吐量。
通過增加內存來減少 I/O 的操作。
對于小型系統來說,垂直擴展是一個不錯的選擇,因為硬件升級的成本較低,但這種方式也有如下限制:
不可能無限擴展單個服務器的能力。主要取決于操作系統以及服務器的內存總線寬度。
在升級系統的內存時,必須關閉服務器,因此,如果系統只有一臺服務器,停機是不可避免的。
功能強大的計算機通常比流行的硬件貴很多。
向上擴展不僅適用于硬件,同時也適用于軟件,例如,優化查詢和應用程序代碼。
隨著用戶數量的增長,一臺服務器是遠遠不夠的。這時,我們需要考慮將單個服務器分成多個服務器。
隨著用戶數據增長,一臺服務器永遠都不夠
這種架構有以下優點:
Web 服務器和數據庫服務器可以分別調優;
Web 服務器需要更好的 CPU,而數據庫服務器則需要更多內存;
Web 層和數據層可以使用單獨的服務器,并獨立地擴展。
向外擴展也稱為“橫向擴展”,我們可以向資源池添加更多實體(機器、服務)。水平擴展比垂直擴展更難實現,因為我們需要在構建系統之前考慮好。
通常,水平擴展的初始成本較高,因為即使是最基本的功能也需要多臺服務器來處理,但后期的回報更豐富。因此,我們需要權衡利弊。
增加服務器數量意味著需要維護的資源也更多。
需要修改系統的代碼,以實現在多臺服務器上的并行處理和工作負載分攤。
負載均衡器是一種專門的硬件或軟件組件,可將流量分散到服務器集群中,以提高系統(包括但不限于應用程序、網站或數據庫)的響應能力和可用性。
使用負載均衡器來平衡所有節點之間的流量
通常,負載均衡器位于客戶端與服務器之間,接收傳入的網絡和應用程序流量,并通過各種算法在多個后端服務器之間分配流量。所以,它也可以用在多種地方,例如;Web 服務器與數據庫服務器之間,以及客戶端與 Web 服務器之間。
HAProxy 和 NGINX 是兩種流行的開源負載均衡軟件。
負載均衡技術是一種保證容錯的方法,可按如下方式提高可用性:
如果服務器 1 離線,所有流量都將路由到服務器 2 和服務器 3。網站不會離線。此時你需要向服務器池添加一個健康的新服務器,以平衡負載。
當流量快速增長時,你只需要在 Web 服務器池中添加更多服務器,負載均衡器就會將流量路由到新的服務器上。
負載均衡器采用各種策略和工作分配算法來優化負載的分配,如下所示:
輪轉:在這種情況下,每個服務器按先進先出 (FIFO) 的順序接收請求。
最少連接數:請求將被定向到連接數量最少的服務器。
最快響應時間:請求將被定向到響應時間最快(最近或頻繁)的服務器。
加權:更強大的服務器收到的請求比較弱的服務器更多。
IP Hash:在這種情況下,根據計算的客戶端 IP 地址的哈希值將請求重定向到服務器。
平衡多個服務器間請求的最直接的方法是使用硬件設備:
直接向共享 IP 添加服務器,或刪除服務器。
可以根據需要進行負載平衡。
軟件負載平衡比硬件負載平衡器更為廉價。這里的負載均衡在第 4 層(網絡層)和第 7 層(應用層)運行。
第 4 層:負載均衡器使用網絡層的 TCP 協議提供的信息。這一層的負載均衡在選擇服務器時通常不會查看請求內容。
第 7 層:可以根據查詢字符串、cookie 或任何頭部信息平衡請求,也可以使用源地址、目標地址等常規的層信息來平衡請求。
擴展關系數據庫
在簡單的系統中,我們可以使用Oracle 或 MySQL之類的關系型數據庫來保存數據項。但是關系數據庫系統有其自身的挑戰,尤其是當我們需要擴展它們時。
有許多技術可以擴展關系數據庫:主從復制、主主復制、聯合、分片、非規范化和 SQL 調優。
復制指的是一種將相同數據的多個副本存儲在不同的機器上的技術。
聯合(或功能分區)會按功能拆分數據庫。
分片是一種與分區相關的數據庫架構模式,可以將不同的數據放在不同的服務器上,不同的用戶可以訪問不同的數據。
反規范化可以將數據寫入多個表,從而避免昂貴的連接,以犧牲部分寫入性能為代價來提高讀取性能。
SQL 調優。
主從復制
主從復制技術能夠將數據從一臺數據庫服務器(主服務器)復制到一臺或多臺數據庫服務器(從服務器),如下圖所示。
主節點更新
更新數據時,客戶端需要連接到主服務器。
接著,數據會被復制到從服務器,直到所有數據在服務器之間保持一致。
這種方法仍然存在一些瓶頸:
如果主服務器由于某種原因宕機,仍然可以通過從服務器讀取數據,只不過無法寫入新數據了。
我們需要額外的算法來將從服務器提升為主服務器。
下面是一些解決方案,可以實現只有一臺服務器處理更新請求的情況。
同步解決方案:數據修改事務需要等到所有服務器都接受后才提交(分布式事務),因此不會在故障轉移時丟失數據。
異步解決方案:提交 -> 延遲 -> 復制到的其他服務器,因此在故障轉移時可能會丟失一些數據更新。
如果同步解決方案太慢,則可以改為異步解決方案。
每個數據庫服務器都可以與其他服務器同時擔任主服務器。在某個時間點,所有主服務器進行同步,以確保它們保存了正確以及最新的數據。
節點讀寫數據庫
主主復制的優勢在于:
如果某個主服務器出現故障,其他數據庫服務器可以正常運行,而且還可以擔負起主服務器的責任。當數據庫服務器重新上線后,可以通過復制來更新數據。
主站可以位于多個物理站點,并且可以分布在整個網絡中。
但服務器的更新能力受限于主服務器。
聯合(或功能分區)會按功能拆分數據庫。例如,你可以擁有三個數據庫,分別用于論壇、用戶和產品,這樣就可以減少每個數據庫的讀寫流量,從而減少復制延遲。
按功能拆分數據庫
更小的數據庫可以將更多的數據保存在內存中,這樣可以改善緩存的局部性,進而提高緩存命中率。由于沒有單一的中央主序列化寫入,你可以實現并行寫入,從而提高吞吐量。
分片(也稱為數據分區)是一種將大數據庫分成許多小塊的技術,每個數據庫只能管理數據的一個子集。
在理想情況下,每個用戶都使用不同的數據庫節點。這種方式助于提高系統的可管理性、性能、可用性和負載均衡。
每個用戶只需與一臺服務器對話,因此可以快速獲得服務器的響應。
服務器之間的負載均衡更好,例如,如果我們有五臺服務器,則每臺服務器只需處理 20% 的負載。
在實踐中,有許多不同的技術可以將數據庫分解為多個小塊。
這種技術會將不同的行放入不同的表中。例如,如果我們將用戶的個人資料存儲在一個表中,則可以將ID小于1000的用戶存儲在一個表中,同時將ID大于1001且小于2000的用戶存儲在另一個表中。
不同行放入不同表中
在這種情況下,我們根據服務器中保存的與特定功能相關的表來劃分數據。例如,如果我們正在構建一個類似 Instagram 的系統,我們需要在數據庫中存儲與用戶、上傳的照片以及他們關注的人相關的數據,我們可以將用戶個人資料信息放在一個數據庫服務器上,將好友列表放在另一個服務器上,而第三個服務器上則保存照片。
把劃分數據存儲在相應的表中
如果想以松散耦合的方式解決這個問題,則需要創建一個查找服務,該服務知道當前的分區模式,并擁有一份每個實體到其所屬的數據庫分片的映射。
當數據存儲的擴展超出單個存儲節點的可用資源,或者需要通過減少數據存儲的競爭來提高性能時,我們就可以采用這種方法。但請記住,分片技術存在以下一些常見問題:
多表連接會變得更加昂貴,并且在某些情況下無法實現。
分片會損害數據庫參照完整性。
數據庫架構變更可能會變得非常昂貴。
數據分布不均勻,有些分片的負載很高。
反規范化會以犧牲部分寫入性能為代價來提高讀取性能。數據的冗余副本會被寫入多個表,以避免昂貴的多表連接。
當數據的分布采用聯合和分片等技術之后,跨數據中心的管理連接會進一步增加復雜性。反規范化可以規避這種復雜的連接。
在大多數系統中,讀取的次數大大超過了寫入的次數,比例為 100:1,甚至 1000:1。因此,每當讀取涉及復雜的數據庫連接時,就可能會非常昂貴,并在磁盤操作上花費大量時間。
有些關系數據庫,比如 PostgreSQL 和 Oracle 支持物化視圖,它們會存儲冗余信息,并保持冗余副本一致。
在數據庫領域,有兩種主要的解決方案:SQL 和 NoSQL。二者的構建方式、存儲信息的類型以及使用的存儲方法都不同。
關系數據庫以行和列的形式存儲數據。每一行包含關于一個實體的所有信息,每一列包含所有的單獨數據點。
最流行的關系數據庫包括 MySQL、Oracle、MS SQL Server、SQLite、Postgres 以及 MariaDB等。
NoSQL又稱為非關系數據庫。這些數據庫通常分為五個主要類別:鍵值數據庫、圖數據庫、列數據庫、文檔數據庫以及 Blob 數據庫。
數據存儲在鍵值對數組中。“鍵”是鏈接到“值”的屬性名稱。常見的鍵值存儲包括 Redis、Voldemort 和 Dynamo。
在這些數據庫中,數據存儲在文檔中(而不是表中的行和列),并且這些文檔歸類成集合。每個文檔可以具有完全不同的結構。
常見的文檔數據庫包括 CouchDB 和 MongoDB。
列式數據庫中,沒有“表”,只有列,它們是行的容器。與關系數據庫不同,我們不需要預先知道所有的列,每一行也不必具有相同的列數。
列式數據庫最適合分析大型數據集,常見的有 Cassandra 和 HBase。
這些數據庫常用于存儲關系最適合用圖表示的數據。數據保存在擁有節點(實體)、屬性(關于實體的信息)和線(實體之間的連接)的圖結構中。
常見的圖數據庫包括 Neo4J 和 InfiniteGraph。
Blob 數據庫就好像文件的鍵/值存儲,可通過API訪問,如 Amazon S3、Windows Azure Blob Storage、Google Cloud Storage、Rackspace Cloud Files 或 OpenStack Swift 等。
數據庫技術的選擇沒有統一的標準。這就是為什么許多企業同時使用 SQL 和 NoSQL 數據庫來滿足不同需求的原因。
如何選擇?
以上,我們談到了數據層的擴展,下面我們來看看Web層的擴展。為了擴展Web層,我們需要將用戶會話(狀態)的數據存儲在關系數據庫或 NoSQL 等數據庫中,將用戶會話(狀態)的數據移出 Web 層。這也稱為無狀態架構。
無狀態系統很簡單
不要使用有狀態的架構。
我們必須盡可能選擇無狀態架構,因為狀態的實現限制了可擴展性,降低了可用性,并增加了成本。
在上述情況下,負載均衡器的效率最高,因為它可以選擇任何服務器來處理請求。
高級概念
負載均衡可以幫助你在數量不斷增加的服務器上進行水平擴展,但緩存能夠更好地利用現有資源,在后續請求期間更快地提供數據。
如果數據不在緩存中,則從數據庫中獲取,然后將其保存到緩存中并從中讀取
通過向服務器添加緩存,我們可以避免直接從服務器讀取網頁或數據,從而減少響應時間,并降低服務器的負載。這也有助于提升應用程序的可擴展性。
緩存可以應用于許多層,例如數據庫層、Web 服務器層和網絡層。
CDN 服務器保存著內容(如圖像、網頁等)的緩存副本,并選擇地理位置最近的服務器處理請求。
使用CDN 可以縮短了用戶的頁面加載時間,因為數據都是從地理位置最近的服務器上加載的。這也有助于提高內容的可用性,因為數據存儲在多個位置。
CDN 的使用縮短了用戶的頁面加載時間,因為數據是在最接近它的位置檢索的
CDN 服務器向Web 服務器發出請求以驗證緩存的內容,并在需要時更新緩存。緩存的內容通常是靜態的,例如 HTML 頁面、圖像、JavaScript 文件、CSS 文件等。
當應用開始進軍全球市場時,你需要在世界各地建立和運維數據中心,以確保產品可以全天候不間斷地提供服務。傳入的請求被路由到基于 GeoDNS 的“最佳”數據中心。
當應用走向全球
GeoDNS 是一項 DNS 服務,允許根據客戶的位置將域名解析為 IP 地址。從亞洲連接的客戶端獲得的IP地址可能不同于從歐洲連接的客戶端。
通過迭代應用本文中的技術,例如無狀態架構、應用負載均衡器、盡可能多地使用緩存數據、支持多個數據中心、在 CDN 上托管靜態資產、通過分片擴展數據庫規模等。我們就可以輕松地將系統擴展到 1 億用戶。
縮放是一個迭代過程
原文鏈接:https://levelup.gitconnected.com/how-to-design-a-system-to-scale-to-your-first-100-million-users-4450a2f9703d
參考鏈接:
https://httpd.apache.org
http://tomcat.apache.org
https://www.oracle.com/database/
https://www.mysql.com
https://en.wikipedia.org/wiki/Domain_Name_System
https://www.facebook.com/note.php?note_id=10150468255628920
*請認真填寫需求信息,我們會在24小時內與您取得聯系。