?在一個遙遠的鄉(xiāng)村發(fā)生了一件事,村里的郵差老王要退休,同時宣布小張成為新一任的郵差,繼續(xù)為村民服務(wù)。這里的村民生活的nginx帝國地域遼闊,人口眾多。帝國和百姓溝通的媒介就是各村的郵差。村民平時遇到問題只需要交給郵差,國王就會迅速將處理 a結(jié)果交由郵差帶回。
這天村民李二將一張名為”https://xxx.com/abc?name=li“ 的憑條交給了小張,在師父老王的陪同下開始了繼任工作以來的第一次任務(wù)。小張了解到各村都有大量的人去帝國辦理事情,將行李包里裝的滿滿當當。正在為自己準備充分而心里暗喜時,卻發(fā)現(xiàn)師傅老王只是輕裝上陣。
小張很疑惑的問師傅:“國家人口眾多,國王能處理的過來這么多請求嗎?如果要等待很長的時間呢?”。老王則讓小張也帶些簡單物品就上路了,并順帶解釋了nginx的多進城的部門結(jié)構(gòu)和異步非阻塞的事件處理機制。

首先,nginx國王在首都建立了一個完善的中央政府機構(gòu)叫master,來接收全國各地的請求。實際上中央系統(tǒng)master并沒有真正去處理這些事務(wù),而是交給了自己的幾個地方政府worker。master負有監(jiān)管的責(zé)任,當某個worker系統(tǒng)故障癱瘓,或者國王需要更新服務(wù)配置時,國王就會向master發(fā)送信號,master接收到信號后,會組建一個新的繼任者worker來處理新的請求,老的worker將所有未處理的請求完成后就光榮退休了。
小張問:“這么多worker,一個請求會不會被多個worker去執(zhí)行,而系統(tǒng)在worker間不停切換導(dǎo)致?lián)p耗大量的資源?”老王好像早已經(jīng)知道小張的疑惑,國王安排的worker之間是平等的關(guān)系,他們各自復(fù)制了和master中央系統(tǒng)一樣的結(jié)構(gòu)。一個請求進來,worker會去競爭一把鎖accept_mutex,搶到鎖之后就開始處理讀取,解析,處理請求,產(chǎn)生數(shù)據(jù)結(jié)果返回出來,最終完成這次請求,都只在一個worker中處理的。對于每個worker來說,獨立的空間,相互之間不會影響,其他worker發(fā)生故障也不會影響自己。

小張問:“master將請求分給worker,一個worker處理一個請求,處理速度怎么會快?并發(fā)怎么會高呢?”。這就是nginx的“異步非阻塞”了,老王解釋道。我們的請求到nginx要經(jīng)過多部門的一系列操作,nginx同時監(jiān)控多個事件,如果某一步操作比較耗費時間,nginx就會返回AGAIN信號來告訴我們該事件還沒有處理好,需要等待一些時間,nginx在這段時間就去處理其他人的具體請求了,nginx通過這種機制才能高并發(fā)的完成眾多請求的處理。
這樣雖然同時處理的請求就一個,但是在請求間不停地切換,只處理準備好的事件。同時高效率處理大量的請求,而沒有產(chǎn)生過多的資源浪費