深入淺出 nginx lua 為什么高性能


最近很多人問我nginx lua的優勢是什么?為什么?

一、同步和異步、阻塞和非阻塞

如果要說清楚這個問題首先要了解:同步和異步、阻塞和非阻塞的關系

  1. 同步:php、java的正常代碼都是同步執行的
  2. 異步:javascript的回調函數就是異步的

說白了自己寫的程序里面如果沒有回調函數都是同步的,常見的php、python等語言少有異步代碼,當前大量使用異步代碼的有javascript。

  1. 阻塞:查詢數據庫或者讀寫文件,如果沒有獲取結果就一直等待,說明是阻塞的。
  2. 非阻塞:執行之后立刻返回是非阻塞的

比如: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM