1、如何測(cè)試并發(fā)量?
可以使用apache提供的ab工具測(cè)試。
對(duì)于后端是動(dòng)態(tài)服務(wù)來(lái)說(shuō),比如Java和PHP。這類服務(wù)器(如JBoss和PHP-FPM)的IO處理能力往往不高。Nginx有個(gè)好處是它會(huì)把Request在讀取完整之前buffer住,這樣交給后端的就是一個(gè)完整的HTTP請(qǐng)求,從而提高后端的效率,而不是斷斷續(xù)續(xù)的傳遞(互聯(lián)網(wǎng)上連接速度一般比較慢)。同樣,Nginx也可以把response給buffer住,同樣也是減輕后端的壓力。
● nginx相對(duì)apache的優(yōu)點(diǎn):
輕量級(jí),同樣起web服務(wù),比apache占用更少的內(nèi)存及資源
抗并發(fā),nginx處理請(qǐng)求是異步非阻塞的,而apache則是阻塞型的,在高并發(fā)下nginx能保持
低資源低消耗高性能
高度模塊化的設(shè)計(jì),編寫(xiě)模塊相對(duì)簡(jiǎn)單
社區(qū)活躍,各種高性能模塊出品迅速
● Apache相對(duì)nginx的優(yōu)點(diǎn):
Apache的rewrite比nginx的rewrite強(qiáng)大
Apache模塊超多,基本想到的都可以找到
Apache的bug少,nginx的bug相對(duì)較多
Apache超穩(wěn)定,一般來(lái)說(shuō),需要性能的web服務(wù)用nginx。如果不需要性能只求穩(wěn)定,那就用apache
進(jìn)程數(shù)與并發(fā)數(shù)不存在很直接的關(guān)系。這取決取server采用的工作方式。如果一個(gè)server采用一個(gè)進(jìn)程負(fù)責(zé)一個(gè)request的方式,那么進(jìn)程數(shù)就是并發(fā)數(shù)。那么顯而易見(jiàn)的,就是會(huì)有很多進(jìn)程在等待中。等什么?最多的應(yīng)該是等待網(wǎng)絡(luò)傳輸。
Nginx的異步非阻塞工作方式正是利用了這點(diǎn)等待的時(shí)間。在需要等待的時(shí)候,這些進(jìn)程就空閑出來(lái)待命了。因此表現(xiàn)為少數(shù)幾個(gè)進(jìn)程就解決了大量的并發(fā)問(wèn)題。apache是如何利用的呢,簡(jiǎn)單來(lái)說(shuō):同樣的4個(gè)進(jìn)程,如果采用一個(gè)進(jìn)程負(fù)責(zé)一個(gè)request的方式,那么,同時(shí)進(jìn)來(lái)4個(gè)request之后,每個(gè)進(jìn)程就負(fù)責(zé)其中一個(gè),直至?xí)掙P(guān)閉。期間,如果有第5個(gè)request進(jìn)來(lái)了。就無(wú)法及時(shí)反應(yīng)了,因?yàn)?個(gè)進(jìn)程都沒(méi)干完活呢,因此,一般有個(gè)調(diào)度進(jìn)程,每當(dāng)新進(jìn)來(lái)了一個(gè)request,就新開(kāi)個(gè)進(jìn)程來(lái)處理。nginx不這樣,每進(jìn)來(lái)一個(gè)request,會(huì)有一個(gè)worker進(jìn)程去處理。但不是全程的處理,處理到什么程度呢?處理到可能發(fā)生阻塞的地方,比如向上游(后端)服務(wù)器轉(zhuǎn)發(fā)request,并等待請(qǐng)求返回。那么,這個(gè)處理的worker不會(huì)這么傻等著,他會(huì)在發(fā)送完請(qǐng)求后,注冊(cè)一個(gè)事件:“如果upstream返回了,告訴我一聲,我再接著干”。于是他就休息去了。此時(shí),如果再有request進(jìn)來(lái),他就可以很快再按這種方式處理。而一旦上游服務(wù)器返回了,就會(huì)觸發(fā)這個(gè)事件,worker才會(huì)來(lái)接手,這個(gè)request才會(huì)接著往下走。由于web server的工作性質(zhì)決定了每個(gè)request的大部份生命都是在網(wǎng)絡(luò)傳輸中,實(shí)際上花費(fèi)在server機(jī)器上的時(shí)間片不多。這是幾個(gè)進(jìn)程就解決高并發(fā)的秘密所在。webserver剛好屬于網(wǎng)絡(luò)io密集型應(yīng)用,不算是計(jì)算密集型。異步,非阻塞,使用epoll,和大量細(xì)節(jié)處的優(yōu)化。也正是nginx之所以然的技術(shù)基石。
ZooKeeper是一個(gè)分布式的,開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。
ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù),將簡(jiǎn)單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。ZooKeeper包含一個(gè)簡(jiǎn)單的原語(yǔ)集,提供Java和C的接口。ZooKeeper代碼版本中,提供了分布式獨(dú)享鎖、選舉、隊(duì)列的接口,代碼在zookeeper-3.4.3\src\recipes。其中分布鎖和隊(duì)列有Java和C兩個(gè)版本,選舉只有Java版本。
● 原理:
ZooKeeper是以Fast Paxos算法為基礎(chǔ)的,Paxos算法存在活鎖的問(wèn)題,即當(dāng)有多個(gè)proposer交錯(cuò)提交時(shí),有可能互相排斥導(dǎo)致沒(méi)有一個(gè)proposer能提交成功,而Fast Paxos作了一些優(yōu)化,通過(guò)選舉產(chǎn)生一個(gè)leader(領(lǐng)導(dǎo)者),只有l(wèi)eader才能提交proposer,具體算法可見(jiàn)Fast Paxos。因此,要想弄懂ZooKeeper首先得對(duì)Fast Paxos有所了解。
● ZooKeeper的基本運(yùn)轉(zhuǎn)流程:
選舉Leader。
同步數(shù)據(jù)。
選舉Leader過(guò)程中算法有很多,但要達(dá)到的選舉標(biāo)準(zhǔn)是一致的。
Leader要具有最高的執(zhí)行ID,類似root權(quán)限。5、集群中大多數(shù)的機(jī)器得到響應(yīng)并follow選出的Leader。
Solr是一個(gè)獨(dú)立的企業(yè)級(jí)搜索應(yīng)用服務(wù)器,它對(duì)外提供類似于Web-service的API接口。用戶可以通過(guò)http請(qǐng)求,向搜索引擎服務(wù)器提交一定格式的XML文件,生成索引;也可以通過(guò)Http Get操作提出查找請(qǐng)求,并得到XML格式的返回結(jié)果。
● 特點(diǎn):
Solr是一個(gè)高性能,采用Java5開(kāi)發(fā),基于Lucene的全文搜索服務(wù)器。同時(shí)對(duì)其進(jìn)行了擴(kuò)展,提供了比Lucene更為豐富的查詢語(yǔ)言,同時(shí)實(shí)現(xiàn)了可配置、可擴(kuò)展并對(duì)查詢性能進(jìn)行了優(yōu)化,并且提供了一個(gè)完善的功能管理界面,是一款非常優(yōu)秀的全文搜索引擎。
● 工作方式:
文檔通過(guò)Http利用XML加到一個(gè)搜索集合中。查詢?cè)摷弦彩峭ㄟ^(guò)http收到一個(gè)XML/JSON響應(yīng)來(lái)實(shí)現(xiàn)。它的主要特性包括:高效、靈活的緩存功能,垂直搜索功能,高亮顯示搜索結(jié)果,通過(guò)索引復(fù)制來(lái)提高可用性,提供一套強(qiáng)大Data Schema來(lái)定義字段,類型和設(shè)置文本分析,提供基于Web的管理界面等。
可以設(shè)置文檔中域的boost值,boost值越高,計(jì)算出來(lái)的相關(guān)度得分就越高,排名也就越靠前。此方法可以把熱點(diǎn)商品或者推廣商品的排名提高。
Ik分詞器的分詞原理本質(zhì)上是詞典分詞。先在內(nèi)存中初始化一個(gè)詞典,然后在分詞過(guò)程中挨個(gè)讀取字符,和字典中的字符相匹配,把文檔中的所有的詞語(yǔ)拆分出來(lái)的過(guò)程。
WebService是一種跨編程語(yǔ)言和跨操作系統(tǒng)平臺(tái)的遠(yuǎn)程調(diào)用技術(shù)。所謂跨編程語(yǔ)言和跨操作平臺(tái),就是說(shuō)服務(wù)端程序采用java編寫(xiě),客戶端程序則可以采用其他編程語(yǔ)言編寫(xiě).跨操作系統(tǒng)平臺(tái)則是指服務(wù)端程序和客戶端程序可以在不同的操作系統(tǒng)上。
RMI是java語(yǔ)言本身提供的遠(yuǎn)程通訊協(xié)議,穩(wěn)定高效,是EJB的基礎(chǔ)。但它只能用于JAVA程序之間的通訊。Hessian和Burlap是caucho公司提供的開(kāi)源協(xié)議,基于HTTP傳輸,服務(wù)端不用開(kāi)防火墻端口。協(xié)議的規(guī)范公開(kāi),可以用于任意語(yǔ)言??缙脚_(tái)有點(diǎn)小問(wèn)題。
Httpinvoker是SpringFramework提供的遠(yuǎn)程通訊協(xié)議,只能用于JAVA程序間的通訊,且服務(wù)端和客戶端必須使用SpringFramework。Web service是連接異構(gòu)系統(tǒng)或異構(gòu)語(yǔ)言的首選協(xié)議,它使用SOAP形式通訊,可以用于任何語(yǔ)言,目前的許多開(kāi)發(fā)工具對(duì)其的支持也很好。
效率相比:RMI > Httpinvoker >= Hessian > Burlap > web service。
一種軟件架構(gòu)風(fēng)格、設(shè)計(jì)風(fēng)格,而不是標(biāo)準(zhǔn),只是提供了一組設(shè)計(jì)原則和約束條件。它主要用于客戶端和服務(wù)器交互類的軟件。REST指的是一組架構(gòu)約束條件和原則。滿足這些約束條件和原則的應(yīng)用程序或設(shè)計(jì)就是RESTful。它結(jié)構(gòu)清晰、符合標(biāo)準(zhǔn)、易于理解、擴(kuò)展方便,所以正得到越來(lái)越多網(wǎng)站的采用。