最近很多人問我nginx lua的優勢是什么?為什么?
一、同步和異步、阻塞和非阻塞
如果要說清楚這個問題首先要了解:同步和異步、阻塞和非阻塞的關系
- 同步:php、java的正常代碼都是同步執行的
- 異步:javascript的回調函數就是異步的
說白了自己寫的程序里面如果沒有回調函數都是同步的,常見的php、python等語言少有異步代碼,當前大量使用異步代碼的有javascript。
- 阻塞:查詢數據庫或者讀寫文件,如果沒有獲取結果就一直等待,說明是阻塞的。
- 非阻塞:執行之后立刻返回是非阻塞的
比如:nginx的模塊調用,程序請求了一個讀數據庫的操作,然后該干嘛干嘛,等到讀取結果返回之后,再做剩下的事情。
二、nginx的非阻塞模型
很多人分不清楚異步和非阻塞的區別,按照我的理解主要是主體不同,異步指的是自己寫的程序是否有類似回調函數的功能,而非阻塞指的是nginx主體調用讀寫操作,當數據庫沒有返回結果的時候,不影響其他的用戶請求。
由於咱們使用的是lua,使用這個腳本語言大多場景也是同步的,很好理解,所以咱們主要說一下nginx-lua如何實現非阻塞的。其實非阻塞的功能使用nginx實現的,基本與lua無關,那么nginx如何實現非阻塞的哪?
一般的web服務器都是建立在tcp請求基礎之上的非阻塞事件模型,例如:
比如咱們使用tomcat服務器或者apache服務器處理一個請求,肯定是建立一個線程或者進程中完成並返回給服務器
那么nginx則不然:
他把請求分成了幾個階段,每個階段由不同的模塊來處理,這樣就實現了更全面的非阻塞處理http請求
三、性能
上面分析完了基本的原理,那么為何么nginx-lua的性能由於nginx-php哪?如果並發數量不高,那么兩者其實沒什么區別,只有並發數量上來之后,由於lua運行時占用內存特別少,放入了nginx模塊內部,可以最大限度的承接nginx提供的非阻塞功能,只要后端數據庫io跟的上,那么nginx-lua就能並發處理很多請求,更詳細的原因可以參考王曉哲的分析文章:http://developer.51cto.com/art/201207/350070.htm