(一)Zookeeper分布式環(huán)境指揮官
zookeeper基礎(chǔ)
ZooKeeper是一種分布式協(xié)調(diào)服務(wù)拇颅,用于管理大型主機(jī)。在分布式環(huán)境中協(xié)調(diào)和管理服務(wù)是一個(gè)復(fù)雜的過程乔询。ZooKeeper通過其簡單的架構(gòu)和API解決了這個(gè)問題樟插。ZooKeeper允許開發(fā)人員專注于核心應(yīng)用程序邏輯,而不必?fù)?dān)心應(yīng)用程序的分布式特性竿刁。
分布式應(yīng)用的優(yōu)點(diǎn)
(1)可靠性?- 單個(gè)或幾個(gè)系統(tǒng)的故障不會使整個(gè)系統(tǒng)出現(xiàn)故障黄锤。
(2)可擴(kuò)展性?- 可以在需要時(shí)增加性能,通過添加更多機(jī)器食拜,在應(yīng)用程序配置中進(jìn)行微小的更改鸵熟,而不會有停機(jī)時(shí)間。
(3)透明性?- 隱藏系統(tǒng)的復(fù)雜性负甸,并將其顯示為單個(gè)實(shí)體/應(yīng)用程序旅赢。
分布式應(yīng)用的挑戰(zhàn)
(1)競爭條件?- 兩個(gè)或多個(gè)機(jī)器嘗試執(zhí)行特定任務(wù),實(shí)際上只需在任意給定時(shí)間由單個(gè)機(jī)器完成惑惶。例如,共享資源只能在任意給定時(shí)間由單個(gè)機(jī)器修改短纵。
(2)死鎖?- 兩個(gè)或多個(gè)操作等待彼此無限期完成带污。
(3)不一致?- 數(shù)據(jù)的部分失敗。
(二)Nginx高并發(fā)分流進(jìn)階實(shí)戰(zhàn)
nginx如何實(shí)現(xiàn)高并發(fā)
簡單來講香到,就是異步鱼冀,非阻塞,使用了epoll和大量的底層代碼優(yōu)化悠就。
稍微詳細(xì)一點(diǎn)展開的話千绪,就是nginx的特殊進(jìn)程模型和事件模型的設(shè)計(jì)。
進(jìn)程模型
nginx采用一個(gè)master進(jìn)程梗脾,多個(gè)woker進(jìn)程的模式荸型。
master進(jìn)程主要負(fù)責(zé)收集、分發(fā)請求炸茧。當(dāng)一個(gè)請求過來時(shí)瑞妇,master拉起一個(gè)worker進(jìn)程負(fù)責(zé)處理這個(gè)請求。
master進(jìn)程也要負(fù)責(zé)監(jiān)控woker的狀態(tài)梭冠,保證高可靠性
woker進(jìn)程一般設(shè)置為跟cpu核心數(shù)一致辕狰。nginx的woker進(jìn)程跟apache不一樣。apche的進(jìn)程在同一時(shí)間只能處理一個(gè)請求控漠,所以它會開很多個(gè)進(jìn)程蔓倍,幾百甚至幾千個(gè)。而nginx的woker進(jìn)程在同一時(shí)間可以處理額請求數(shù)只受內(nèi)存限制,因此可以處理多個(gè)請求偶翅。
事件模型
nginx是異步非阻塞的默勾。
每進(jìn)來一個(gè)request,會有一個(gè)worker進(jìn)程去處理倒堕。但不是全程的處理灾测,處理到什么程度呢?處理到可能發(fā)生阻塞的地方垦巴,比如向上游(后端)服務(wù)器轉(zhuǎn)發(fā)request媳搪,并等待請求返回。那么骤宣,這個(gè)處理的worker不會這么傻等著秦爆,他會在發(fā)送完請求后,注冊一個(gè)事件:“如果upstream返回了憔披,告訴我一聲等限,我再接著干”。于是他就休息去了芬膝。此時(shí)望门,如果再有request 進(jìn)來,他就可以很快再按這種方式處理锰霜。而一旦上游服務(wù)器返回了筹误,就會觸發(fā)這個(gè)事件,worker才會來接手癣缅,這個(gè)request才會接著往下走厨剪。
web server的工作性質(zhì)決定了每個(gè)request的大部份生命都是在網(wǎng)絡(luò)傳輸中,實(shí)際上花費(fèi)在server機(jī)器上的時(shí)間片不多友存。這是幾個(gè)進(jìn)程就解決高并發(fā)的秘密所在祷膳。
(三)rabbitMQ消息中間件
(1)Broker: 消息中間件實(shí)例, 可能是單個(gè)節(jié)點(diǎn)也可能是運(yùn)行在多節(jié)點(diǎn)集群上的邏輯實(shí)體
(2)消息(Message):?消息由消息頭和消息體兩部分組成。消息頭中包括routing-key屡立、priority等標(biāo)準(zhǔn)消息頭以及其它自定義消息頭直晨,用于定義RabbitMQ對消息行為。消息體是字節(jié)流侠驯,包含消息內(nèi)容抡秆。
(3)連接(Connection):?客戶端與 Broker 之間的 TCP連接
(4)信道(Channel):?Channel 是建立在 TCP 連接上的邏輯(虛擬)連接。多個(gè) Channel 復(fù)用同一個(gè) TCP 連接, 以避免建立 TCP 連接的巨大開銷吟策。 RabbitMQ 官方要求每個(gè)線程使用獨(dú)立的 Channel, 禁止多個(gè)線程共用 Channel儒士。
(5)生產(chǎn)者(Publisher):?發(fā)送消息的客戶端線程
(6)消費(fèi)者(Consumer):?處理消息的客戶端線程
(7)交換機(jī)(Exchange):?交換機(jī)負(fù)責(zé)將消息投遞到相應(yīng)的隊(duì)列
(8)隊(duì)列(Queue):?接收并保存交換機(jī)投遞的消息,直至被消費(fèi)者成功消費(fèi)檩坚。邏輯結(jié)構(gòu)遵循先進(jìn)先出FIFO着撩。
(9)綁定(Binding):?將隊(duì)列(Queue)注冊到交換機(jī)(Exchange)的路由表
(10)虛擬主機(jī)(Vhost):?每個(gè)Broker下可建立多個(gè)vhost, 每個(gè) vhost 可建立獨(dú)立的 Exchange诅福、Queue、綁定及權(quán)限系統(tǒng)拖叙。同一個(gè) Broker 下的 vhost 共享 Connection氓润、Channel 和 用戶系統(tǒng),就是說可以使用同一個(gè)用戶身份使用同一個(gè) Channel 訪問不同 vhost薯鳍。
(四)ActiveMQ消息中間件
(1)多種語言和協(xié)議編寫客戶端咖气。語言: Java,C,C++,C#,Ruby,Perl,Python,PHP。應(yīng)用協(xié)議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
(2)完全支持JMS1.1和J2EE 1.4規(guī)范 (持久化挖滤,XA消息崩溪,事務(wù))
(3) 對Spring的支持,ActiveMQ可以很容易內(nèi)嵌到使用Spring的系統(tǒng)里面去斩松,而且也支持Spring2.0的特性
(4) 通過了常見J2EE服務(wù)器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的測試伶唯,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業(yè)服務(wù)器上
(5) 支持多種傳送協(xié)議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
(6)支持通過JDBC和journal提供高速的消息持久化
(7)從設(shè)計(jì)上保證了高性能的集群惧盹,客戶端-服務(wù)器乳幸,點(diǎn)對點(diǎn)
(8) 支持Ajax
(9)支持與Axis的整合
(10)可以很容易的調(diào)用內(nèi)嵌JMS provider,進(jìn)行測試
(五)Redis高性能緩存數(shù)據(jù)庫
Redis的數(shù)據(jù)結(jié)構(gòu)和相關(guān)常用命令
Key:Redis采用Key-Value型的基本數(shù)據(jù)結(jié)構(gòu)钧椰,任何二進(jìn)制序列都可以作為Redis的Key使用(例如普通的字符串或一張JPEG圖片)
String:String是Redis的基礎(chǔ)數(shù)據(jù)類型粹断,Redis沒有Int、Float嫡霞、Boolean等數(shù)據(jù)類型的概念姿染,所有的基本類型在Redis中都以String體現(xiàn)。
SET:為一個(gè)key設(shè)置value秒际,可以配合EX/PX參數(shù)指定key的有效期,通過NX/XX參數(shù)針對key是否存在的情況進(jìn)行區(qū)別操作狡汉,時(shí)間復(fù)雜度O(1)
GET:獲取某個(gè)key對應(yīng)的value娄徊,時(shí)間復(fù)雜度O(1)
GETSET:為一個(gè)key設(shè)置value,并返回該key的原value盾戴,時(shí)間復(fù)雜度O(1)
MSET:為多個(gè)key設(shè)置value寄锐,時(shí)間復(fù)雜度O(N)
MSETNX:同MSET,如果指定的key中有任意一個(gè)已存在尖啡,則不進(jìn)行任何操作橄仆,時(shí)間復(fù)雜度O(N)
MGET:獲取多個(gè)key對應(yīng)的value,時(shí)間復(fù)雜度O(N)
INCR:將key對應(yīng)的value值自增1衅斩,并返回自增后的值盆顾。只對可以轉(zhuǎn)換為整型的String數(shù)據(jù)起作用。時(shí)間復(fù)雜度O(1)
INCRBY:將key對應(yīng)的value值自增指定的整型數(shù)值畏梆,并返回自增后的值您宪。只對可以轉(zhuǎn)換為整型的String數(shù)據(jù)起作用奈懒。時(shí)間復(fù)雜度O(1)
DECR/DECRBY:同INCR/INCRBY,自增改為自減宪巨。
(六)項(xiàng)目實(shí)戰(zhàn)資料
(1)kafka百萬級吞實(shí)戰(zhàn)
(2)Memcached進(jìn)階實(shí)戰(zhàn)
(3)高性能緩存開發(fā)實(shí)戰(zhàn)
(4)MongoDB進(jìn)階實(shí)戰(zhàn)
需要項(xiàng)目資料(可私信我免費(fèi)領(lǐng)取答案)私信【學(xué)習(xí)資料】即可領(lǐng)取
附加java開發(fā)的資料(面試資源與經(jīng)驗(yàn)總結(jié)磷杏,Dubbo、Redis捏卓、設(shè)計(jì)模式极祸、Netty、zookeeper怠晴、Spring cloud遥金、分布式、高并發(fā)等架構(gòu)技術(shù)視頻教程資料,架構(gòu)思維導(dǎo)圖龄寞,以及面試資料汰规,了解最新的學(xué)習(xí)動態(tài);了解最新的阿里物邑、京東招聘資訊)