失聯的架構師只留下一段腳本
㈠ PHP是什麼
PHP是PHP的遞歸首字母縮寫:Hypertext Preprocessor,一種用於創建動態和互動式HTML網頁的腳本語言。當網站訪問者打開頁面時,伺服器處理PHP命令,然後將結果發送到訪問者的瀏覽器。
主要特點
①開源性和免費性
由於PHP的解釋器的源代碼是公開的,所以安全系數較高的網站可以自己更改PHP的解釋程序。另外,PHP運行環境的使用也是免費的。
②快捷性
PHP是一種非常容易學習和使用的一門語言,它的語法特點類似於C語言,但又沒有C語言復雜的地址操作,而且又加入了面向對象的概念,再加上它具有簡潔的語法規則,使得它操作編輯非常簡單,實用性很強。
③資料庫連接的廣泛性
PHP可以與很多主流的資料庫建立起連接,如Mysql、ODBC、Oracle等,PHP是利用編譯的不同函數與這些資料庫建立起連接的,PHPLIB就是常用的為一般事務提供的基庫。
④面向過程和面向對象並用
在PHP語言的使用中,可以分別使用面向過程和面向對象,而且可以將PHP面向過程和面向對象兩者一起混用,這是其它很多編程語言是做不到的。
(1)失聯的架構師只留下一段腳本擴展閱讀
PHP優點
①流行,容易上手
PHP是目前最流行的編程語言,這毋庸置疑。它驅動全球超過2億多個網站,有全球超過81.7%的公共網站在伺服器端採用PHP。PHP常用的數據結構都內置了,使用起來方便簡單,也一點都不復雜,表達能力相當靈活。
②開發職位很多
在伺服器端的網站編程中PHP會更容易幫助你找到工作。很多互聯網相關企業都在使用PHP開發框架,所以可以說市場對PHP的開發程序員的需求還是比較大的。
③仍然在不斷發展
PHP在不斷兼容著類似closures和命名空間等技術,同時兼顧性能和當下流行的框架。版本是7之後,一直在提供更高性能的應用。
④可植入性強
PHP語言在補丁漏洞升級過程中,核心部分植入簡單易行,且速度快。
⑤拓展性強
PHP語言在資料庫應用過程中,可以從資料庫調取各類數據,執行效率高
㈡ 如何引用第三方 resty 庫
和大部分知名開源軟體誕生在歐美國家不同,OpenResty自身和依賴的主要組件都是金磚國家的開發者發明的,這點還挺有意思。
Nginx是俄羅斯人發明的,Lua是巴西幾個教授發明的,中國人章亦春把LuaJITVM嵌入到Nginx中,實現了OpenResty這個高性能服務端解決方案。
通過OpenResty,你可以把nginx的各種功能進行自由拼接,更重要的是,開發門檻並不高,這一切都是用強大輕巧的Lua語言來操控。
它主要的使用場景主要是:
在Lua中揉和和處理各種不同的nginx上游輸出(Proxy,Postgres,Redis,Memcached等)
在請求真正到達上游服務之前,Lua可以隨心所欲的做復雜的訪問控制和安全檢測
隨心所欲的操控響應頭裡面的信息
從外部存儲服務(比如Redis,Memcached,MySQL,Postgres)中獲取後端信息,並用這些信息來實時選擇哪一個後端來完成業務訪問
在內容handler中隨意編寫復雜的Web應用,使用同步但依然非阻塞的方式,訪問後端資料庫和其他存儲
在rewrite階段,通過Lua完成非常復雜的URLdispatch
用Lua可以為nginx子請求和任意location,實現高級緩存機制
組織OpenResty技術大會之前,我一直認為自己是一個孤獨的OpenResty使用者,覺得自己在使用一個冷門的技術。
雖然大家都聽說過OpenResty或者ngx_lua,但感覺用在生產環境中使用的卻少之又少,除了幾個CDN公司外,好像沒有聽說過哪家知名互聯網公司在使用。而CDN行業之所以使用,很多是受到cloudflare技術棧的影響,OpenResty的作者也在國外這家CDN公司。
但辦完這個大會,我發現使用者真的挺多,奇虎360的所有服務端團隊都在使用,京東、網路、魅族、知乎、優酷、新浪這些互聯網公司都在使用。有用來寫WAF、有做CDN調度、有做廣告系統、消息推送系統,還有像我們部門一樣,用作APIserver的。有些還用在非常關鍵的業務上,比如開濤在高可用架構分享的京東商品詳情頁,是我知道的ngx_lua最大規模的應用。
2.奇虎企業安全服務端技術選型的標准
先說下3年多前做架構選型的時候,我為什麼會選擇OpenResty?
其實架構如何設計並不重要,因為每家公司,每個團隊,他們的公司文化和技術背景各不相同,生搬硬套會適得其反。重要的是當初為什麼這么選擇,中途為什麼調整。
我們的產品要求單機上面,服務端提供高性能的API介面,QPS至少過萬,未來需要支撐到10萬。我們並沒有急於去使用PHP、python或者其他的語言來實現功能,而是先勾勒出一個理想化的技術模型。
這個模型應該具備:
非阻塞的訪問網路IO。在連接MySQL、Redis和發起HTTP請求時,工作進程不能傻傻的等待網路IO的返回,而是需要支持事件驅動,用協程的方式讓CPU資源更有效的去處理其他請求。很多語言並不具備這樣的能力和周邊庫。
有完備的緩存機制。不僅需要支持Redis、Memcached等外部緩存,也應該在自己的進程內有緩存系統。我們希望大部分的請求都能在一個進程中得到數據並返回,這樣是最高效的方法,一旦有了網路IO和進程間的交互,性能就會受到很大影響。
同步的寫代碼邏輯,不要讓開發者感知到回調和非同步。這個也很重要,程序員也是人,代碼應該更符合人的思維習慣,顯式的回調和非同步關鍵字,會打斷思路,也給調試帶來困難。
最好是站在巨人肩上,基於成熟的技術上搭建。採用一門全新誕生的語言和技術,需要經歷語言自身發展期頻繁調整的陣痛,還可能站錯隊。
不僅支持Linux平台,還需要支持Windows平台,這個是我們產品很特別的需求,很多中小企業用戶還是習慣Windows的操作,不具備Linux的維護能力。
基於以上幾點的考慮,考察了當時的一些方案,選擇了OpenResty。
首先,它最大的特點就是用同步的代碼邏輯實現非阻塞的調用,其次它有單進程內的LRUcache和進程間的shareDICTcache,而且它是揉合nginx和LuaJIT而產生的。而且nginx有Windows版本,雖然有非常多的限制,但這些限制都是可以解決的,nginx官方Windows版本中不支持的特性,我們開源出來的版本都解決了。
第一次看到這樣的方案,我覺得它肯定會顛覆高性能服務端的開發。為什麼呢?在我之前的公司里,每天會有近百億次的查詢請求,而伺服器只用了十台。
我們採用了nginxC模塊+內置在nginx中的K-V資料庫(自己開發的),來實現所有的業務邏輯,達到這個目標。聽上去很簡單,但是過程非常艱辛,兩三個十幾年工作經驗的大牛做了一年多才穩定下來。絕大部分開發能力不足,只能望塵莫及。而且後續的調試和維護,也會花費不少精力。
但是OpenResty的出現改變了這一切,OpenResty非常的pythonic,適合人類的正常思維。新手經過一兩個月的學習,做出來的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的開發更容易接受和上手。Vanilla已經在新浪移動開始使用,一些核心業務,比如高清圖和體育直播,正在向這個框架遷移中。
4.入門痛點,以及學習的正確方法
我和周晶的入門,都是自己摸著石頭過河。當時除了Python社區「大媽」的那篇使用文章外,找不到其他的資料。
奇虎和新浪都用OpenResty成功替換了之前的技術,但問題還是挺明顯,就是大家都認為自己是孤獨的使用者,同事中基本沒有人認同。在關鍵和支撐業務上,使用OpenResty有些不放心,都會在邊緣業務上先做嘗試和驗證。
雖然OpenResty的性能做的很棒,比肩或者超過其他所有的高性能解決方案,但是擔心沒有學習資料、擔心招不到人、擔心沒人交流,可能還擔心作者章亦春哪天撂挑子不幹了,這個項目就黃了。
高可用架構群里的各位都是架構師,是技術決策者,在引入一門新技術的時候,肯定會考慮到這些風險。比如小米科技馬利超在高可用架構的分享,他們在搶購系統中曾經使用過ngx_lua,雖然性能滿足需求,但是團隊裡面熟悉的人少,最後還是改成了Go語言實現。
如何解決這些擔憂?社區是有過思考和討論的,我們放在分享最後講。先從一個嘗試使用這門技術的開發者的角度看,OpenResty不少基礎工作沒有完善,友好程度不夠:
只能從源碼安裝,沒有apt-get、brew等軟體倉庫安裝方法;安裝第三方庫沒有PIP、NPM之類的包管理工具,需要去先谷歌,然後拷貝代碼文件到指定的目錄下,才能require使用。
代碼編寫需要修改nginx.conf和對應的lua代碼,即使是helloworld也是如此。當然你可以把代碼寫在nginx的配置文件裡面,但是生產環境肯定是要分離的。這種編寫代碼的方式,不像是一個編程語言,和常規的編程方式不同。
有獨特的執行階段概念,因為OpenResty是基於nginx的,所以也繼承它的這種概念。你的代碼邏輯,可能需要放在不同的階段裡面運行,才能獲取你想要的預期。而這些階段間信息如何傳遞,以及哪些API不能在某些階段使用,就會經常攔住新手。
遇到問題只有郵件列表這一種方式來溝通,而郵件列表是被牆的。文檔也只有英文版本,導致很多新手的問題無法被解決。
沒有系統學習OpenResty的手段,大都是業務需要實現什麼功能,就去文檔和API裡面去找。至於方式對不對,能不能優化,就不知道了。