當前位置:編程學習大全網 - 編程語言 - 如何學會用正確的姿勢放松

如何學會用正確的姿勢放松

什麽是1。OpenResty又適合什麽場景?

與大多數誕生於歐美的知名開源軟件不同,OpenResty本身及其所依賴的主要組件都是由金磚國家的開發者發明的,這壹點相當有趣。

Nginx是俄羅斯人發明的,Lua是巴西幾位教授發明的,中國人張宜春將LuaJITVM嵌入Nginx,實現了OpenResty這種高性能服務器解決方案。

通過OpenResty可以自由拼接nginx的各種功能,更重要的是開發門檻不高,全部由強大輕量級的Lua語言控制。

其主要使用場景有:

揉合和處理各種nginx上遊輸出(代理、Postgres、Redis、Memcached等。)在Lua。

在請求實際到達上遊服務之前,Lua可以隨意進行復雜的訪問控制和安全檢查。

隨意操縱響應頭中的信息。

從外部存儲服務(如Redis、Memcached、MySQL、Postgres)獲取後端信息,利用這些信息實時選擇哪個後端完成業務訪問。

在content handler中隨意編寫復雜的Web應用,以同步但仍無阻塞的方式訪問後端數據庫和其他存儲。

在重寫階段,通過Lua完成壹個非常復雜的URLdispatch。

Lua可以用來實現nginx子請求和任意位置的高級緩存機制。

在組織OpenResty技術大會之前,我壹直以為自己是壹個孤獨的OpenResty用戶,覺得自己在用壹個冷門的技術。

雖然大家都聽說過OpenResty或者ngx_lua,但是感覺很少用在生產環境中。除了少數幾個CDN公司,我好像沒聽說過有哪個知名的互聯網公司在用。CDN行業使用受cloudflare技術棧影響,OpenResty作者也是國外CDN公司。

但是這次發布會之後,我發現用戶真的很多。奇虎360的服務器團隊都在用,JD.COM、百度、魅族、知乎、優酷、新浪等互聯網公司都在用。有的用來寫WAF,CDN調度,廣告系統,消息推送系統,還有的像我們部門壹樣,用作APIserver。其中有些還用在非常關鍵的業務上,比如陶凱在高可用架構中分享的JD.COM產品詳情頁,這是我所知道的ngx_lua最大的應用。

2.奇虎企業安全服務器技術選擇標準

先說說三年多前我做架構選擇的時候為什麽選擇了OpenResty。

其實架構怎麽設計並不重要,因為每個公司,每個團隊,他們的企業文化和技術背景都不壹樣,生搬硬套會適得其反。重要的是當初為什麽選擇,為什麽中途調整。

我們的產品要求單機,服務器提供高性能API接口。QPS至少10000,未來需要支持到65438+萬。我們不急著用PHP、Python或者其他語言來實現功能,而是先畫壹個理想化的技術模型。

該模型應該具有:

對網絡IO的無阻塞訪問。在連接MySQL、Redis和發起HTTP請求時,工作進程不能等待網絡IO的返回,而需要支持事件驅動,讓CPU資源以協作的方式更有效地處理其他請求。很多語言沒有這樣的能力和外圍庫。

有完整的緩存機制。不僅需要支持Redis和Memcached等外部緩存,還應該在自己的進程中有壹個緩存系統。我們希望大部分請求可以在壹個進程中獲取數據並返回,這是最高效的方法。壹旦出現網絡IO和進程間的交互,性能會受到很大影響。

同步寫代碼邏輯,不要讓開發人員感知到回調和異步。這壹點也很重要。程序員也是人,代碼應該更符合人的思維習慣。顯式回調和異步關鍵字會打斷思路,給調試帶來困難。

最好是站在巨人的肩膀上,建立在成熟的技術之上。采用壹種全新的語言和技術,需要經歷語言本身發展期頻繁調整的陣痛,也可能會站錯邊。

不僅支持Linux平臺,還支持Windows平臺,這是我們產品非常特殊的需求。很多中小企業用戶還是習慣Windows的操作,不具備Linux的維護能力。

基於以上考慮,考察了當時的壹些方案,選擇了OpenResty。

首先,它最大的特點是使用同步代碼邏輯實現非阻塞調用。其次,它在單個進程內有LRUcache,在進程間有shareDICTcache,它是由nginx和LuaJIT混合產生的。而且nginx有Windows版本。雖然有很多限制,但是這些限制是可以解決的。nginx官方Windows版本不支持的功能在我們的開源版本中已經解決了。

第壹次看到這樣的方案,我覺得肯定會顛覆高性能服務器的發展。為什麽?我之前的公司,每天有近100億的查詢請求,只用了十臺服務器。

我們用nginx(自己開發)內置的nginxC模塊+K-V數據庫來實現所有的業務邏輯,達到這個目的。聽起來很簡單,但是過程很難。花了兩三個有十幾年工作經驗的大牛壹年多才定下來。大部分開發能力不足,只能留守。而且後續的調試和維護也會耗費大量的精力。

但是OpenResty的出現改變了這壹切。OpenResty很有詩意,適合人類正常思維。新手做的API經過壹兩個月的學習,可以達到nginxC模塊的性能,代碼量大大減少,也方便調試。

3.以奇虎和新浪為例,如何將新技術引入項目?

技術選擇只是第壹步。如何將OpenResty引入到壹個產品或項目中?給大家看看奇虎企業安全和新浪手機的真實案例。我和新浪移動的周劍都在壹個有成熟產品的部門。憑借壹兩個人的力量,我們用壹種新的技術取代了原有的技術框架。但由於企業產品和個人產品的不同,方法也大相徑庭。

先說說我所在的奇虎企業的安全問題。2012年初加入這個部門。當時主要產品是免費的,目標用戶是小企業。所以在架構設計上,只考慮幾十個或者幾百個終端請求,使用非常強綁定的Windows平臺技術,傾向於在沒有開源軟件的情況下做出壹個更適合自己的新框架。包括C++開發的Webserver,PHP路由和自己寫的框架,數據存儲在sqlite中。

我幫忙修改了兩個月PHP的bug,了解了技術架構的思路後,就去了新的產品線。這是壹個實驗性的產品,主要面向央企和專網。網絡中有數百萬個終端。

壹開始沒幾個人關註,我就直接采用了Linux+OpenResty+Redis+Postgres的開源組件,性能測試之前是n塊。後壹個實驗產品和前壹個產品合並為壹個產品,技術分為兩套架構。老功能用老架構,新功能用新架構。

隨著越來越多用戶的增加,原有的技術架構開始捉襟見肘,技術欠賬積壓增多。隨著用戶的抱怨,sqlite被拋棄,被Postgres取代。但是自己開發的框架還是有些弄巧成拙。

在此期間,通過對比測試、OpenResty培訓和多次用戶性能問題調查,讓開發學員知道這項技術的優勢。被加班壓得喘不過氣來的開發學生逐漸選擇使用OpenResty而不是自研框架來開發新功能和遷移舊功能,以避免加班。

產品重新配置時,完全放棄了自研的服務器框架,開發服務器的學生從8、9人減少到3人。在引入新技術的過程中,我們沒有采取強制措施,因為企業產品需要穩定,用戶部署的版本更新非常慢。

新浪移動在周劍的做法對每個人來說都更有意義。新浪移動最初基於Apache,使用PHP處理用戶請求。Apache是同步多進程模型,並發請求不多的情況下沒有問題。

但是,總會有意想不到的消息,比如馬航失聯,文章出軌。突如其來的高流量幾次壓過了背景。而且可以預測世界杯的流量會非常大,所以周劍用nginx替換Apache,用nginx的fast_cgi_cache,用了幾個月,QPS升級了壹個數量級。

新浪移動的後臺的接口是用PHP實現的,在高並發下有些不足。Nginx的簡單緩存可以滿足性能,但是不能滿足業務精細化和數據壹致性的要求。我們需要找到PHP之外的解決方案,前提是PHP的開發可以用的很舒服。node.js回調到地獄,Go調試不方便,都是障礙。

他們最終選擇了OpenResty,並基於OpenResty開放了壹個Web框架Vanilla(香草),模仿了Yaf的使用習慣,讓PHP的開發更容易被接受和入門。新浪移動壹直使用香草,壹些核心業務,比如高清圖文、體育直播等,都在向這個框架遷移。

4.入門的痛點和正確的學習方法

我和周劍開始獨自過河。當時除了Python社區裏“阿姨”的用法文章,沒有其他信息。

奇虎和新浪已經用OpenResty成功替代了之前的技術,但是問題還是比較明顯,就是大家都認為自己是孤獨的用戶,同事中幾乎沒有人認同。在關鍵和支撐業務上,有人對使用OpenResty不放心,會先嘗試驗證邊緣業務。

雖然OpenResty的性能非常優秀,堪比或優於所有其他高性能解決方案,但由於擔心沒有學習資料,沒有招聘,沒有溝通,以及作者張宜春有壹天會退出,該項目將會毀於壹旦。

高可用性架構組中的每個人都是架構師和技術決策者。在引入壹項新技術時,這些風險肯定會被考慮在內。比如小米科技馬李超分享的高可用架構。他們在搶購系統中使用了ngx_lua。雖然表演符合需求,但是團隊裏沒幾個人熟悉,最後改成了Go語言。

如何解決這些顧慮?社區裏已經有了壹些反思和討論,我們會在分享的最後講到。首先,從壹個嘗試使用這項技術的開發者的角度來看,OpenResty的很多基礎工作都不夠完善和友好:

只能從源代碼安裝,沒有apt-get、brew等軟件倉庫安裝方式。沒有用於安裝第三方庫的軟件包管理工具,如PIP和NPM。妳需要先去Google,然後把代碼文件復制到指定的目錄下,才可以使用require。

編碼需要修改nginx.conf和對應的lua代碼,即使是helloworld。當然妳可以把代碼寫在nginx的配置文件裏,但是生產環境壹定要分開。這種編寫代碼的方式不同於編程語言,也不同於常規的編程方法。

有壹個獨特的執行階段概念,因為OpenResty是基於nginx的,所以也繼承了這個概念。您的代碼邏輯可能需要在不同的階段運行,以獲得您想要的預期。這些階段之間如何傳遞信息,有些階段哪些API不能用,往往會讓新手止步。

遇到問題只有壹種溝通方式,郵件列表被屏蔽。文檔只有英文版,導致很多新手問題無法解決。

學習OpenResty沒有系統的方法,大部分都需要了解業務需要在文檔和API中實現哪些功能。至於正確的方式,能不能優化,我不知道。

  • 上一篇:鋁型材加工要求
  • 下一篇:叠代法計算弱酸弱堿鹽的水解平衡
  • copyright 2024編程學習大全網