在若干次前的一場面試,面試官看我做過python爬蟲/后端 的工作,順帶問了我些后端相關(guān)的問題:你覺得什么是后端?
送命題。當(dāng)時(shí)腦瓦特了,答曰:邏輯處理和數(shù)據(jù)增刪改查。。。
在本文中,我將嘗試總結(jié)前端須知的后端體系入門。
無論你的動(dòng)機(jī)是什么,這個(gè)體系里都有你想要了解或?qū)W習(xí)的東西:
存儲(chǔ)和服務(wù)如何結(jié)合在一起?
什么時(shí)候(或?yàn)槭裁矗┪倚枰玫竭@個(gè)?
全棧之路該怎么走?
各技術(shù)的主流框架選擇
本文目錄:
Web / Application Servers
負(fù)載均衡器: Load Balancer
域名解析系統(tǒng),DNS
HTTPS / SSL證書
數(shù)據(jù)庫,Database
Blob / 文件存儲(chǔ)
內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)
緩存服務(wù):Caching Service
消息隊(duì)列:Message queue
Web Servers服務(wù)器:Web服務(wù)器,使用http協(xié)議向Web提供內(nèi)容。
Application Servers:應(yīng)用程序服務(wù)器,托管并公開業(yè)務(wù)邏輯和進(jìn)程。
1.1 服務(wù)器端語言
例如Node.js,Python,PHP,Java,C#或Ruby。
每種語言都有自己的“Web框架”(例如基于 Java 的 Spring,基于 Ruby 的 Rails,基于C#的ASP.NET MVC或基于Node.js的Express)。
這些框架使開發(fā)人員能夠編寫更少的代碼來處理數(shù)據(jù)請(qǐng)求。
1.2 后端語言選擇而事實(shí)上,每個(gè)后端語言都有不一樣的特性,也都有各自的擁護(hù)者。哪一個(gè)語言最適合做為后端語言的入門一直都是沒有定論的問題。但為了讓我們可以對(duì)各語言有一個(gè)很簡單的概念,以下整理了各語言較常被提及的特色、在開發(fā)上比較被人詬病的點(diǎn),以及有什么樣的網(wǎng)站是透過該語言開發(fā)的:
PHP:
使用者多,算是最普及的后端語言。
簡單易學(xué),但因一些古老的設(shè)計(jì)飽受批評(píng)。
網(wǎng)站范例:Facebook、Wordpress、新浪微博。
Java:
老牌語言,開發(fā)統(tǒng)治者。國內(nèi)外工作需求穩(wěn)定,應(yīng)用層面廣。
開發(fā)相較起來較慢,沒那麼適合新手。
網(wǎng)站范例:Linkedin、Amazon、淘寶。
Ruby:
開發(fā)快速,國內(nèi)外很多 bootcamp 都以此語言教后端。
適不適合新手學(xué)飽受爭議。
網(wǎng)站范例:Airbnb、Twitter。
Python:
語法簡單易學(xué),數(shù)據(jù)分析與資料探勘相關(guān)應(yīng)用多。
多帶帶使用 Python 相較起來運(yùn)行性能較差。
網(wǎng)站范例:Instagram、Reddit、知乎。
JavaScript (Node.js):
前端后端都可用 JS,高并發(fā)的情況執(zhí)行效率極高
不適合 CPU 密集的應(yīng)用
初創(chuàng)型企業(yè)首選
網(wǎng)站范例:Yahoo、Walmart
Go:
Google力推,有很完善的標(biāo)準(zhǔn)庫,效能強(qiáng)大堪比C系列。
目前學(xué)習(xí)資源較少(感謝偉大B站的付出,真香)
網(wǎng)站范例:Google、Youtube、嗶哩嗶哩、頭條、騰訊云
1.2 Web服務(wù)器
快速重定向某些請(qǐng)求而不必通過后端代碼執(zhí)行此操作(狀態(tài)碼404頁面)。
存儲(chǔ)在Web服務(wù)器的文件系統(tǒng)上的靜態(tài)內(nèi)容(例如圖像,CSS,JS)比通過后端代碼訪問更快。
某些服務(wù)器端語言(例如PHP)沒有內(nèi)置的生產(chǎn)級(jí)Web服務(wù)器,因此需要通過專用的Web服務(wù)器進(jìn)程啟動(dòng)。
至此,會(huì)引出一個(gè)疑問:Apache、Nginx、Tomcat和Node.js四者的區(qū)別是什么?
引用:apache、node.js、nginx、tomcat誰能幫我捋一捋關(guān)系?
是一類東西,又不是一類東西。
Tomcat 只能跟 Java配合,Node.js只能跟JavaScript。
Apache 能和其他語言配合(通常跟 PHP 配合居多),但需要借助不同的模塊。
Nginx則是通過端口轉(zhuǎn)發(fā),所以Apache和Nginx可以和各種編程語言一起使用
Nginx和Apache是純web服務(wù)器,不具備解析動(dòng)態(tài)語言(比如php文件和js文件)的能力.
Tomcat和Node.js 能夠解析這些腳本語言,提供應(yīng)用服務(wù),Web Server算是附加的功能。
1.3 web服務(wù)器的形式(載體)安裝這些工具和后端項(xiàng)目的Web服務(wù)器計(jì)算機(jī),本身可以采用以下幾種形式:
一臺(tái)物理機(jī)器
虛擬專用服務(wù)器,即我們通常所說的VPS(例如華為云,阿里云等)
VPS實(shí)際上是被劃分為幾個(gè)部分的獨(dú)立服務(wù)器,每個(gè)部分作為多帶帶的VPS服務(wù)器進(jìn)行銷售和使用。也就是說,它是一臺(tái)可運(yùn)行多個(gè)Web應(yīng)用程序(網(wǎng)站、軟件等)的相對(duì)獨(dú)立的機(jī)器,每個(gè)用戶擁有部分資源。
托管虛擬機(jī)實(shí)例(例如AWS EC2,Google Compute Engine)
平臺(tái)即服務(wù)(PaaS)主機(jī),云服務(wù)提供商(例如Heroku,AWS Elastic Beanstalk)
1.4 Dokcer,虛擬機(jī)與物理機(jī)VPS是基于軟件層的虛擬化技術(shù),具體來說就是操作系統(tǒng)的虛擬化,VM是基于硬件層的虛擬化技術(shù),VM主機(jī)使用vmware server搭建。
docker容器與虛擬機(jī)有什么區(qū)別?
用個(gè)類比來極簡說明一下:
1. 物理機(jī)是這樣的:
2. 虛擬機(jī)是這樣的:
3. Dokcer是這樣的:
2. 負(fù)載均衡器: Load Balancer
負(fù)載均衡是高可用網(wǎng)絡(luò)基礎(chǔ)架構(gòu)的的一個(gè)關(guān)鍵組成部分,有了負(fù)載均衡,我們通??梢詫⑽覀兊膽?yīng)用服務(wù)器部署多臺(tái),然后通過負(fù)載均衡將用戶的請(qǐng)求分發(fā)到不同的服務(wù)器用來提高網(wǎng)站、應(yīng)用、數(shù)據(jù)庫或其他服務(wù)的性能以及可靠性。
負(fù)載平衡器模型通常分為兩類:第4層(傳輸層)和第7層(應(yīng)用層)。
第4層(傳輸層)::
根據(jù)網(wǎng)絡(luò)和傳輸層協(xié)議(IP,TCP,F(xiàn)TP,UDP)中的數(shù)據(jù)進(jìn)行操作。
不認(rèn)識(shí)http協(xié)議,對(duì)應(yīng)其他TCP應(yīng)用,例如基于C/S開發(fā)的ERP等系統(tǒng)。
第7層(應(yīng)用層)::
根據(jù)應(yīng)用層協(xié)議(如HTTP)中的數(shù)據(jù)分發(fā)請(qǐng)求。
認(rèn)識(shí)http協(xié)議,所以其應(yīng)用范圍主要是眾多的網(wǎng)站或者內(nèi)部信息平臺(tái)等基于B/S開發(fā)的系統(tǒng)。
負(fù)載均衡器主要分為硬件負(fù)載均衡和軟件負(fù)載均衡兩大類。
硬件負(fù)載均衡: 對(duì)應(yīng)第四層,如F5負(fù)載均衡器
軟件負(fù)載均衡: 對(duì)應(yīng)第七層,如LVS、Nginx和HAproxy
兩種類型的負(fù)載平衡器都會(huì)收到請(qǐng)求,并根據(jù)配置的算法將這些請(qǐng)求分發(fā)到特定的服務(wù)器。一些行業(yè)標(biāo)準(zhǔn)算法是:
輪詢調(diào)度,Round robin,RR
加權(quán)輪詢,Weighted round robin,WRB
最少連接數(shù),Least connections
最短的響應(yīng)時(shí)間,Least response time
在Web應(yīng)用程序中使用負(fù)載均衡器有兩個(gè)主要好處:
它通過確保單個(gè)Web服務(wù)器不會(huì)被所有請(qǐng)求淹沒,來幫助維持一致的響應(yīng)時(shí)間,因此處理每個(gè)請(qǐng)求的速度會(huì)相對(duì)慢些。
它保持高可用性。如果服務(wù)器崩潰,所有后續(xù)客戶端請(qǐng)求仍將成功,因?yàn)樗鼈儗⒙酚傻浇】档姆?wù)器,并且用戶不會(huì)發(fā)現(xiàn)任何問題。
3. 域名解析系統(tǒng),DNS當(dāng)用戶在其地址欄中輸入URL時(shí),瀏覽器將獲取URL的域部分(例如www.google.com)并調(diào)用DNS 。DNS解析發(fā)回該網(wǎng)站服務(wù)器的IP地址位置(例如172.217.23.4)。一旦它具有IP地址,它就可以發(fā)送對(duì)網(wǎng)頁的實(shí)際請(qǐng)求。
如果你的Web應(yīng)用程序使用負(fù)載均衡器,則應(yīng)將域名配置為指向負(fù)載均衡器的域名或IP地址。
如果您沒有使用負(fù)載均衡器,那么您可以將域名直接指向應(yīng)用程序服務(wù)器的域名/ IP地址。
大多數(shù)互聯(lián)網(wǎng)域名注冊(cè)服務(wù)(例如GoDaddy,萬網(wǎng)等)都提供DNS管理控制臺(tái)。這些允許你配置域名(和子域)以指向應(yīng)用程序的位置。
如果你愿意,還可以將您的域名服務(wù)器轉(zhuǎn)移到阿里云、騰訊云等云提供商,并從那里進(jìn)行管理。這樣做的好處是可以將所有應(yīng)用程序環(huán)境配置保存在一個(gè)位置,并使其更易于自動(dòng)化。
4. HTTPS / SSL證書如果你正在構(gòu)建Web應(yīng)用程序(或靜態(tài)網(wǎng)站),則需要通過HTTPS提供服務(wù),以確保用戶與服務(wù)器之間的安全通信?,F(xiàn)在使用HTTPS 也有SEO的好處,所以沒有理由不使用它。
這意味著需要在后端安裝SSL證書。具體來說,需要在任何服務(wù)器上安裝它們,這是客戶端請(qǐng)求的第一個(gè)聯(lián)系點(diǎn)。這通常意味著負(fù)載均衡器和CDN服務(wù)器,但如果你沒有使用負(fù)載均衡器,也可能是應(yīng)用程序服務(wù)器。
你可以使用LetsEncrypt免費(fèi)生成證書。
如果你使用的是云基礎(chǔ)架構(gòu),則可以使用托管服務(wù),例如AWS Certificate Manager。這允許你創(chuàng)建并自動(dòng)續(xù)訂SSL證書并將其分發(fā)到應(yīng)用程序服務(wù)器,負(fù)載平衡器和CDN服務(wù)器。
只有中大型的HTTPS證書授權(quán)中心才會(huì)被瀏覽器承認(rèn),否則會(huì)顯示為不安全,需要手動(dòng)信任。
目前SSL證書根據(jù)驗(yàn)證級(jí)別分為三種類型
域名型SSL證書,簡稱DV SSL
企業(yè)型SSL證書,簡稱OV SSL
增強(qiáng)型SSL證書,簡稱EV SSL。
它們之間都有一定的區(qū)別,認(rèn)證級(jí)別也都不同,各自適合不同規(guī)模類型的網(wǎng)站安裝。
5. 數(shù)據(jù)庫,Database
幾乎所有Web應(yīng)用程序都需要在某處保留數(shù)據(jù)。在大多數(shù)情況下,某處即某種形式的數(shù)據(jù)庫。 數(shù)據(jù)庫的主要工作是將數(shù)據(jù)可靠地保存到永久存儲(chǔ)器中,并允許通過查詢檢索數(shù)據(jù)。它還可以圍繞它存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)強(qiáng)制執(zhí)行一些規(guī)則約束。
5.1 數(shù)據(jù)庫的種類早期比較流行的數(shù)據(jù)庫模型有三種,分別為層次式數(shù)據(jù)庫、網(wǎng)絡(luò)式數(shù)據(jù)庫和關(guān)系型數(shù)據(jù)庫。
而在當(dāng)今的互聯(lián)網(wǎng)中,最常用的數(shù)據(jù)庫模型主要是兩種,即關(guān)系型(SQL)數(shù)據(jù)庫和非關(guān)系型(NoSQL)數(shù)據(jù)庫。
關(guān)系數(shù)據(jù)庫(例如MySql,Postgres,SQLServer,Oracle,SQLite)已經(jīng)存在了40多年,并且一直是大多數(shù)Web應(yīng)用程序的支柱。
而在過去十年左右的時(shí)間里,NoSQL數(shù)據(jù)庫(例如MongoDB,Cassandra,CouchDB,DynamoDB)在Web應(yīng)用程序中變得越來越普遍,主要是因?yàn)樗鼈兙哂锌蓴U(kuò)展性優(yōu)勢(shì)和數(shù)據(jù)結(jié)構(gòu)靈活性。
5.2 數(shù)據(jù)庫部署你可以在一臺(tái)服務(wù)器上托管數(shù)據(jù)庫,但在生產(chǎn)方案中更常見的是將其托管在某種形式的集群2臺(tái)或更多服務(wù)器上。這可確保數(shù)據(jù)庫具有高可用性并降低數(shù)據(jù)丟失的風(fēng)險(xiǎn),例如,如果一臺(tái)服務(wù)器的存儲(chǔ)損壞。
近年來,少數(shù)云托管的“無服務(wù)器數(shù)據(jù)庫”已經(jīng)可用。這些是可以通過API調(diào)用的數(shù)據(jù)庫,但你無需設(shè)置服務(wù)器來托管它們。除了處理諸如自動(dòng)備份之類的事情之外,云供應(yīng)商還為您無形地執(zhí)行此操作。這些示例包括DynamoDB(NoSQL),Firebase實(shí)時(shí)數(shù)據(jù)庫(NoSQL)和Aurora無服務(wù)器(關(guān)系)。
5.3 數(shù)據(jù)庫基礎(chǔ)方案來源:架構(gòu)設(shè)計(jì)之「數(shù)據(jù)庫從主備到主主的高可用方案」
無論底層是關(guān)系型數(shù)據(jù)庫,還是NoSQL數(shù)據(jù)庫,無論是 Mysql 還是 Redis、MongoDB,在架構(gòu)設(shè)計(jì)上都是相通的。
數(shù)據(jù)庫服務(wù)器的基礎(chǔ)方案分為三種:
一主一備的架構(gòu)(主備式)
一主一從的架構(gòu)(主從式)
互為主從的架構(gòu)(主主式)
主備式架構(gòu)是雙機(jī)部署中最簡單的一種架構(gòu),幾乎市面上所有的數(shù)據(jù)庫系統(tǒng)都會(huì)自帶這個(gè)主備功能。
其思路也特別的簡單:
將數(shù)據(jù)庫部署到兩臺(tái)機(jī)器,其中一臺(tái)機(jī)器(代號(hào)A)作為日常提供數(shù)據(jù)讀寫服務(wù)的機(jī)器,稱為「主機(jī)」。
另外一臺(tái)機(jī)器(代號(hào)B)并不提供線上服務(wù),但會(huì)實(shí)時(shí)的將「主機(jī)」的數(shù)據(jù)同步過來,稱為「備機(jī)」。
一旦「主機(jī)」出了故障,通過人工的方式,手動(dòng)的將「主機(jī)」踢下線,將「備機(jī)」改為「主機(jī)」來繼續(xù)提供服務(wù)。
這個(gè)架構(gòu)的優(yōu)缺點(diǎn)都很明顯,優(yōu)點(diǎn)就是幾乎不需要做什么開發(fā)改造,各類數(shù)據(jù)庫就支持這種模式,部署維護(hù)起來也簡單,并沒有引入額外的系統(tǒng)復(fù)雜度和瓶頸。
但是缺點(diǎn)呢,就是當(dāng)「主機(jī)」出現(xiàn)故障的時(shí)候,需要人工去干預(yù)啊,運(yùn)維同學(xué)很辛苦的,而且處理還不一定及時(shí)。再還有一個(gè)缺點(diǎn)就是,主備架構(gòu)會(huì)造成嚴(yán)重浪費(fèi)資源,畢竟需要一臺(tái)與「主機(jī)」同等配置的「備機(jī)」長期備著,但又不作為線上服務(wù)來使用,你說浪費(fèi)不浪費(fèi)。
為了解決這個(gè)資源浪費(fèi)問題,我們就得想一個(gè)把「備機(jī)」也用起來的方案:主從式架構(gòu)。
主從式架構(gòu)大體上與上述的主備式架構(gòu)差不多。區(qū)別就是主備式的「備機(jī)」平時(shí)是不干活的的,主要起到備份的作用。而主從式的「備機(jī)」改為了「從機(jī)」,平時(shí)也要提供服務(wù),跟「主機(jī)」一樣隨時(shí)隨刻的在干活的。
主從式架構(gòu)中的「從機(jī)」雖然也在隨時(shí)隨刻提供服務(wù),但是它只提供「讀」服務(wù),并不提供「寫」服務(wù)。
「主機(jī)」會(huì)實(shí)時(shí)的將線上數(shù)據(jù)同步到「從機(jī)」,以保證「從機(jī)」能夠正常的提供讀操作。
這種架構(gòu)相比較主備式,對(duì)資源是一種節(jié)約,畢竟「從機(jī)」也在提供服務(wù),沒有白白的浪費(fèi)。并且在「主機(jī)」出現(xiàn)故障時(shí),在人工介入之前,好歹「從機(jī)」也是能夠提供數(shù)據(jù)的「讀」操作的,畢竟大多數(shù)業(yè)務(wù)都是「讀」多「寫」少,因此對(duì)穩(wěn)定性又提高了一個(gè)層次。
缺點(diǎn)就是架構(gòu)稍微復(fù)雜了一點(diǎn),畢竟「主機(jī)」和「從機(jī)」都有「讀」服務(wù),那么前端業(yè)務(wù)系統(tǒng)就需要用一定策略去判斷該路由到哪一臺(tái)去讀取數(shù)據(jù)。還有就是,延遲問題,「主機(jī)」的數(shù)據(jù)同步到「從機(jī)」難免會(huì)有一定程度的延遲,這個(gè)延遲可能會(huì)對(duì)數(shù)據(jù)實(shí)時(shí)性要求較高的業(yè)務(wù)有一定影響。
互為主從的架構(gòu)是指兩臺(tái)機(jī)器自己都是主機(jī),并且也都是作為對(duì)方的從機(jī)。兩臺(tái)機(jī)器都提供完整的讀寫服務(wù),因此無需切換,客戶機(jī)在調(diào)用的時(shí)候隨機(jī)挑選一臺(tái)即可,當(dāng)其中一臺(tái)宕機(jī)了,另外一臺(tái)還可以繼續(xù)服務(wù)。
采用 互為主從架構(gòu) 有個(gè)復(fù)雜點(diǎn)就是,因?yàn)閮膳_(tái)主機(jī)都接受寫數(shù)據(jù),那就需要將寫的最新數(shù)據(jù)實(shí)時(shí)的同步給對(duì)方,需要將數(shù)據(jù)進(jìn)行兩臺(tái)主機(jī)的雙向復(fù)制。
而雙向復(fù)制不可避免的會(huì)在一定程度上帶來數(shù)據(jù)延遲、極端情況下甚至有數(shù)據(jù)丟失等問題。
在實(shí)際業(yè)務(wù)中,有些業(yè)務(wù)數(shù)據(jù)對(duì)一致性要求是非常高的,并不能接受數(shù)據(jù)的延遲、丟失,因此這類業(yè)務(wù)也不適合互為主從的模式,比如金融業(yè)務(wù)。
但是我們互聯(lián)網(wǎng)業(yè)務(wù)中大多數(shù)場景還是沒有這么高要求的,所以這種模式對(duì)于一般場景還是用的蠻多。
至于數(shù)據(jù)庫集群方案,我暫時(shí)沒看懂,就不寫了。。。
6. Blob / 文件存儲(chǔ)雖然數(shù)據(jù)庫通常用于存儲(chǔ)動(dòng)態(tài)數(shù)據(jù)(例如,由最終用戶或API客戶端生成),但是存在某些類別的數(shù)據(jù)( 非結(jié)構(gòu)化數(shù)據(jù)),這些數(shù)據(jù)不能由用戶改變或者基于文件而不適合數(shù)據(jù)庫存儲(chǔ),例如:
前端網(wǎng)站資源,如圖像,Javascript,CSS,字體,音頻,視頻文件。
用戶通過表單上傳的各類文件。
云服務(wù)供應(yīng)商不是將這些存儲(chǔ)在數(shù)據(jù)庫中,而是提供專用服務(wù)來存儲(chǔ)這些服務(wù),例如AWS Simple Storage Service(S3),Azure,Google Cloud Storage和阿里云OSS等。
這樣做的好處是云供應(yīng)商可以安全地存儲(chǔ)文件,并可以為其制作冗余副本,以最大限度地降低數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
6.1 關(guān)于 Blob 存儲(chǔ):Blob 存儲(chǔ)用于:
直接向?yàn)g覽器提供圖像或文檔。
存儲(chǔ)文件以供分布式訪問。
對(duì)視頻和音頻進(jìn)行流式處理。
向日志文件進(jìn)行寫入。
存儲(chǔ)用于備份和還原、災(zāi)難恢復(fù)及存檔的數(shù)據(jù)。
存儲(chǔ)數(shù)據(jù)以供本地或 Azure 托管服務(wù)執(zhí)行分析
7. 內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)Blob /文件存儲(chǔ)服務(wù)允許客戶端通過HTTP端點(diǎn)訪問文件。例如,您的Web應(yīng)用程序的HTML標(biāo)記可以簡單地鏈接到AWS S3中存儲(chǔ)的圖像和CSS文件的URL。 傳統(tǒng)網(wǎng)絡(luò)訪問:
但是,假設(shè)我的用戶位于中國,我的S3存儲(chǔ)位于美國西部 - 數(shù)據(jù)傳輸距離數(shù)千英里,因此我的用戶會(huì)看到延遲。
CDN是什么?使用CDN有什么優(yōu)勢(shì)?
CDN是云供應(yīng)商提供的服務(wù),它們?cè)谌蚍秶鷥?nèi)分布有“邊緣服務(wù)器”。
這些邊緣服務(wù)器從“原點(diǎn)”(例如,blob /文件存儲(chǔ)位置)獲取文件的副本。你的前端Web應(yīng)用程序?qū)⒅赶?其CDN URL,而不是指向靜態(tài)資產(chǎn)的Blob存儲(chǔ)URL。
現(xiàn)在,客戶端和“邊緣”之間的距離遠(yuǎn)不是幾千英里的往返,而是更少,因此文件的獲取速度更快。
使用了CDN的網(wǎng)站訪問:
7.1 CDN工作流
通過權(quán)威DNS服務(wù)器來實(shí)現(xiàn)最優(yōu)節(jié)點(diǎn)的選擇,通過緩存來減少源站的壓力。
8. 緩存服務(wù):Caching Service雖然CDN是靜態(tài)文件的一種緩存形式,但Web應(yīng)用程序可能需要臨時(shí)緩存動(dòng)態(tài)數(shù)據(jù)。
例如,假設(shè)存在一個(gè)數(shù)據(jù)庫查詢,該查詢對(duì)昨天的數(shù)據(jù)執(zhí)行計(jì)算,其結(jié)果每天經(jīng)常被成千上萬的用戶訪問。每次用戶請(qǐng)求此數(shù)據(jù)時(shí)聯(lián)系數(shù)據(jù)庫就沒有任何意義。
對(duì)此的解決方案是使用高速緩存服務(wù)在第一個(gè)用戶請(qǐng)求之后將結(jié)果存儲(chǔ)一段時(shí)間。通過緩存將更快地提供對(duì)該數(shù)據(jù)的后續(xù)請(qǐng)求。
緩存服務(wù)本質(zhì)上是一種特殊類型的數(shù)據(jù)庫。 緩存采用鍵值存儲(chǔ)的形式,其中鍵是應(yīng)用程序代碼用于查詢數(shù)據(jù)的字符串(例如DailySiteStats_2018-10-17),值是緩存的實(shí)際數(shù)據(jù)。緩存的數(shù)據(jù)通常完全保存在內(nèi)存中,這使得從緩存中檢索數(shù)據(jù)的速度非??臁?/p>
常見的緩存服務(wù)是Redis和Memcached。AWS通過其Elasticache服務(wù)提供這兩者的托管版本。
8.1 Redis和Memcached對(duì)比Redis和Memcached是都是主流的開源內(nèi)存數(shù)據(jù)存儲(chǔ)。雖然它們既易于使用又提供高性能,但在選擇引擎時(shí)需要考慮重要的差異。Memcached是為簡單而設(shè)計(jì)的,而Redis提供了豐富的功能,使其能夠廣泛用于各種用例。
Memcached | Redis | |
---|---|---|
亞毫秒級(jí)延遲 | 是 | 是 |
開發(fā)人員易用性 | 是 | 是 |
數(shù)據(jù)分區(qū) | 是 | 是 |
多語言支持 | 是 | 是 |
高級(jí)數(shù)據(jù)結(jié)構(gòu) | - | 是 |
多線程架構(gòu) | 是 | - |
快照 | - | 是 |
復(fù)制 | - | 是 |
發(fā)布/訂閱 | - | 是 |
Lua腳本 | - | 是 |
地理空間支持 | - | 是 |
亞毫秒級(jí)延遲:
Redis和Memcached都支持亞毫秒的響應(yīng)時(shí)間。通過將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,它們可以比基于磁盤的數(shù)據(jù)庫更快地讀取數(shù)據(jù)。
開發(fā)人員易用性:
Redis和Memcached在語法上都很容易使用,并且需要最少量的代碼才能集成到您的應(yīng)用程序中。
數(shù)據(jù)分區(qū):
Redis和Memcached`都允許您在多個(gè)節(jié)點(diǎn)之間分發(fā)數(shù)據(jù)。這允許您在需求增長時(shí)向外擴(kuò)展以更好地處理更多數(shù)據(jù)。
支持廣泛的編程語言:
Redis和Memcached都有許多面向開發(fā)人員的開源客戶端。支持的語言包括Java,Python,PHP,C,C ++,C#,JavaScript,Node.js,Ruby,Go等等。
高級(jí)數(shù)據(jù)結(jié)構(gòu):
除了字符串,Redis還支持列表,集合,有序集,哈希,位數(shù)組等。應(yīng)用程序可以使用這些更高級(jí)的數(shù)據(jù)結(jié)構(gòu)來支持各種用例。例如,你可以使用Redis排序集輕松實(shí)現(xiàn)游戲排行榜,該排行榜保持按其排名排序的玩家列表。
多線程架構(gòu):
由于Memcached是多線程的,因此它可以使用多個(gè)處理核心。這意味著您可以通過擴(kuò)展計(jì)算容量來處理更多操作。
快照:
使用Redis,您可以使用即時(shí)快照將數(shù)據(jù)保存在磁盤上,該快照可用于存檔或恢復(fù)。
復(fù)制:
Redis允許您創(chuàng)建Redis主數(shù)據(jù)庫的多個(gè)副本。這允許您擴(kuò)展數(shù)據(jù)庫讀取并具有高可用性集群。
發(fā)布/訂閱:
Redis支持使用模式匹配的Pub /Sub消息傳遞,您可以將其用于高性能聊天室,實(shí)時(shí)評(píng)論流,社交媒體源和服務(wù)器互通。
Lua腳本:
Redis允許您執(zhí)行事務(wù)性Lua腳本。腳本可以幫助您提高性能并簡化應(yīng)用程序。
地理空間支持:
Redis具有專門用于大規(guī)模處理實(shí)時(shí)地理空間數(shù)據(jù)的命令。您可以執(zhí)行諸如查找兩個(gè)元素(例如人或地點(diǎn))之間的距離以及查找點(diǎn)的給定距離內(nèi)的所有元素之類的操作。
9. 消息隊(duì)列:Message queue
適用于批處理任務(wù)和分離應(yīng)用程序的異步消息收發(fā)
有時(shí),你程序需要執(zhí)行的任務(wù)與響應(yīng)用戶請(qǐng)求沒有直接關(guān)系。
例如,假設(shè)用戶上傳了需要編碼和水印的視頻。但這是一項(xiàng)長期運(yùn)行的任務(wù),因此讓用戶在完成時(shí)等待是沒有意義的。更好的方法是異步執(zhí)行此操作。您的網(wǎng)絡(luò)應(yīng)用程序代碼會(huì)在隊(duì)列中創(chuàng)建一條作業(yè)消息,并通知您的用戶,當(dāng)水印視頻準(zhǔn)備就緒時(shí),他們將收到一封電子郵件(消息)。
然后,你將擁有一個(gè)可以執(zhí)行以下操作的工作任務(wù)流:
從隊(duì)列中讀取消息。
開始處理視頻。
完成后,保存視頻的編碼副本。
向用戶發(fā)送通知電子郵件(消息)。
從隊(duì)列中刪除消息。
這里有2個(gè)架構(gòu)組件:
您可以通過以下幾種方式實(shí)現(xiàn)worker任務(wù):
調(diào)度CRON作業(yè)以觸發(fā)應(yīng)用程序服務(wù)器上安裝的指定代碼,以便按特定計(jì)劃從隊(duì)列中讀取。
將消息添加到隊(duì)列時(shí),使用FaaS平臺(tái)調(diào)用工作器代碼。
9.1 Message queue 簡介消息隊(duì)列是一種異步的服務(wù)間通信方式,適用于無服務(wù)器和微服務(wù)架構(gòu)。消息在被處理和刪除之前一直存儲(chǔ)在隊(duì)列上。每條消息僅可被一位用戶處理一次。消息隊(duì)列可被用于分離重量級(jí)處理、緩沖或批處理工作以及緩解高峰期工作負(fù)載。
現(xiàn)在常用的MQ組件有activeMQ、rabbitMQ、rocketMQ、zeroMQ 還有近年來火熱的kafka,從某些場景來說也是MQ,當(dāng)然kafka的功能更加強(qiáng)大,雖然不同的MQ都有自己的特點(diǎn)和優(yōu)勢(shì),但是,不管是哪種MQ,都有MQ本身自帶的一些特點(diǎn)。
9.2 MQ主要特性特性 | 說明 |
---|---|
推送或拉取傳送 | 拉取是指不斷查詢隊(duì)列以獲取新消息。推送是指系統(tǒng)在有可用消息時(shí)通知用戶 (也稱為發(fā)布/訂閱消息收發(fā))。您還可以使用長輪詢讓拉取等待指定的時(shí)間,以便新消息在完成之前到達(dá)。 |
定時(shí)或延遲傳送 | 支持為消息設(shè)置特定的傳送時(shí)間。如果需要為所有消息設(shè)置相同延遲,可以設(shè)置一個(gè)延遲隊(duì)列。 |
至少一次傳送 | 消息隊(duì)列可以存儲(chǔ)多個(gè)消息副本以實(shí)現(xiàn)冗余和高可用性,并在發(fā)生通信故障或錯(cuò)誤的情況下重新發(fā)送消息,以確保它們至少經(jīng)過一次傳送。 |
確切一次傳送 | 在不容許重復(fù)的情況下,F(xiàn)IFO (先進(jìn)先出) 消息隊(duì)列會(huì)通過自動(dòng)篩選重復(fù)來確保每個(gè)消息均精確地傳輸了一次 (且只有一次)。 |
FIFO (先進(jìn)先出) 隊(duì)列 | 在這些隊(duì)列中,首先接受處理的是最早的 (或第一個(gè)) 條目,有時(shí)稱為“隊(duì)首”。 |
消息優(yōu)先級(jí) | 通常情況下,您可以為消息分配優(yōu)先級(jí),以確定要在隊(duì)列中添加該消息的位置,從而確保優(yōu)先級(jí)較高的消息位于隊(duì)列前端并得到優(yōu)先處理。 |
來源:MQ(消息隊(duì)列)常見的應(yīng)用場景解析
我們的實(shí)際場景大概是一個(gè)基于微服務(wù)架構(gòu)的電商系統(tǒng),分為用戶微服務(wù)、商品微服務(wù)、訂單微服務(wù)、促銷微服務(wù)等。
基于微服務(wù)模式開發(fā)的系統(tǒng),MQ的使用場景更多。這里我們就列舉一下常見的應(yīng)用示例。
注冊(cè)后我們可能需要做很多初始化的操作,如:
調(diào)用郵件服務(wù)器發(fā)送郵件、調(diào)用促銷服務(wù)贈(zèng)送優(yōu)惠劵、下發(fā)用戶數(shù)據(jù)到客戶關(guān)系系統(tǒng)等。
那么這時(shí)候我們將這些操作去監(jiān)聽MQ,當(dāng)用戶注冊(cè)成功過后,通過MQ通知其他業(yè)務(wù)進(jìn)行操作。確保注冊(cè)用戶的性能。
后臺(tái)發(fā)布商品的時(shí)候:
商品數(shù)據(jù)需要從數(shù)據(jù)庫中轉(zhuǎn)換成搜索引擎數(shù)據(jù)(基于elasticsearch)
那么我們應(yīng)該將商品寫入數(shù)據(jù)庫后,再寫入到MQ,然后通過監(jiān)聽MQ來生成elasticsearch對(duì)應(yīng)的數(shù)據(jù)。
用戶下單后,24小時(shí)未支付,需要取消訂單。
以前我們可能是定時(shí)任務(wù)循環(huán)查詢,然后取消訂單。
實(shí)際上,我更推薦類似延遲MQ的方式,避免了很多無效的數(shù)據(jù)庫查詢,將一個(gè)MQ設(shè)置為24小時(shí)后才讓消費(fèi)者消費(fèi)掉,這樣很大程度上能減輕服務(wù)器壓力。
支付完成后,需要及時(shí)的通知子系統(tǒng)(進(jìn)銷存系統(tǒng)發(fā)貨,用戶服務(wù)積分,發(fā)送短信)進(jìn)行下一步操作。
但是,支付回調(diào)我們都是需要保證高性能的,所以,應(yīng)該直接修改數(shù)據(jù)庫狀態(tài),存入MQ,讓MQ通知子系統(tǒng)做其他非實(shí)時(shí)的業(yè)務(wù)操作。這樣能保證核心業(yè)務(wù)的高效及時(shí)。
免責(zé)聲明逛國外社區(qū)看到這篇,覺得挺簡潔明了的。
只是覺得好玩,就按其大綱,重寫總結(jié)一下,有說錯(cuò)的地方多擔(dān)待。
求一份深圳的內(nèi)推
意思就是寫得略粗糙,別噴我。。。
好了,又水完一篇,入正題:
微信:huab119
作者掘金文章總集需要轉(zhuǎn)載到公眾號(hào)的喊我加下白名單就行了。
「Vue實(shí)踐」5分鐘擼一個(gè)Vue CLI 插件
「Vue實(shí)踐」武裝你的前端項(xiàng)目
「中高級(jí)前端面試」JavaScript手寫代碼無敵秘籍
「從源碼中學(xué)習(xí)」面試官都不知道的Vue題目答案
「從源碼中學(xué)習(xí)」Vue源碼中的JS騷操作
「從源碼中學(xué)習(xí)」徹底理解Vue選項(xiàng)Props
「Vue實(shí)踐」項(xiàng)目升級(jí)vue-cli3的正確姿勢(shì)
為何你始終理解不了JavaScript作用域鏈?
公眾號(hào)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7252.html
摘要:以下內(nèi)容來自我特別喜歡的一個(gè)頻道這是一個(gè)年你成為前端,后端或全棧開發(fā)者的進(jìn)階指南你不需要學(xué)習(xí)所有的技術(shù)成為一個(gè)開發(fā)者這個(gè)指南只是通過簡單分類列出了技術(shù)選項(xiàng)我將從我的經(jīng)驗(yàn)和參考中給出建議首選我們會(huì)介紹通用的知識(shí)最后介紹年的的一些趨勢(shì)基礎(chǔ)前端開 以下內(nèi)容來自我特別喜歡的一個(gè)Youtube頻道: Traversy Media 這是一個(gè)2019年你成為前端,后端或全棧開發(fā)者的進(jìn)階指南: 你...
摘要:耐得住寂寞,才能等得到花開慢慢積累自己的知識(shí),不斷疊加,全面優(yōu)化,無論在哪個(gè)領(lǐng)域都可以有你的一席之地,即為有志者事竟成,破釜沉舟,百二秦關(guān)終屬楚也祝我們能向未來發(fā)展的開發(fā)者們苦心人天不負(fù),臥薪嘗膽,三千越甲可吞吳。 我們今天來了聊一聊一個(gè)話題——全棧開發(fā) 作為一個(gè)程序員,不管是Java還是C...
摘要:本使用創(chuàng)建本地服務(wù)器,在就能完成全部流程,并不需要線上服務(wù)器。路徑要與后端接口一致。后端返回成功后,前端數(shù)據(jù)中對(duì)應(yīng)的元素也要?jiǎng)h掉,更新視圖??刂破骼锬靡粋€(gè)方法出來說一下吧,完整的代碼都在。讀取操作完成后調(diào)用釋放連接。 寫在前面 本文只是本人學(xué)習(xí)過程的一個(gè)記錄,并不是什么非常嚴(yán)謹(jǐn)?shù)慕坛?,希望和大家一起共同進(jìn)步。也希望大家能指出我的問題。適合有一定基礎(chǔ),志在全棧的前端初學(xué)者學(xué)習(xí),從點(diǎn)擊按鈕...
摘要:簡介前端發(fā)展迅速,開發(fā)者富有的創(chuàng)造力不斷的給前端生態(tài)注入新生命,各種庫框架工程化構(gòu)建工具層出不窮,眼花繚亂,不盲目追求前沿技術(shù),學(xué)習(xí)框架和庫在滿足自己開發(fā)需求的基礎(chǔ)上,然后最好可以對(duì)源碼進(jìn)行調(diào)研,了解和深入實(shí)現(xiàn)原理,從中可以獲得更多的收獲隨 showImg(https://segmentfault.com/img/remote/1460000016784101?w=936&h=397)...
閱讀 700·2021-08-17 10:15
閱讀 1804·2021-07-30 14:57
閱讀 2016·2019-08-30 15:55
閱讀 2864·2019-08-30 15:55
閱讀 2748·2019-08-30 15:44
閱讀 719·2019-08-30 14:13
閱讀 2423·2019-08-30 13:55
閱讀 2631·2019-08-26 13:56