nginx都知道性能給力的原因是建立在其異步非阻塞的基礎(chǔ)上實(shí)現(xiàn)的,因此開(kāi)發(fā)nginx插件時(shí)處理網(wǎng)絡(luò)請(qǐng)求一定切記阻塞的方式執(zhí)行某些耗時(shí)操作。否則會(huì)嚴(yán)重影響nginx性能...
這個(gè)問(wèn)題就來(lái)了:如果我想在插件中執(zhí)行某些耗時(shí)操作呢?比如查詢數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)不支持http協(xié)議,有特殊協(xié)議)?
ps: 我可以開(kāi)一個(gè)線程池,這些阻塞操作扔到池子里,但是有什么辦法可以讓當(dāng)前請(qǐng)求處理掛起到nginx框架的事件隊(duì)列里?當(dāng)在阻塞操作的回調(diào)函數(shù)里在發(fā)送改變狀態(tài),讓nginx繼續(xù)接著剛才的請(qǐng)求繼續(xù)處理?
感謝
數(shù)據(jù)庫(kù)查詢本質(zhì)上就是網(wǎng)絡(luò)通信,本質(zhì)上只要你socket的read,write都是非阻塞的就沒(méi)問(wèn)題。說(shuō)起來(lái)容易實(shí)際做起來(lái)比較復(fù)雜。nginx自身有一些可復(fù)用的機(jī)制可以實(shí)現(xiàn)在http上非阻塞的各種操作。然而像tcp之類的通信,可能并沒(méi)有現(xiàn)成的。你要自己去寫(xiě),我感覺(jué)比較復(fù)雜,而且還要結(jié)合在nginx里面。