聊聊開發中經歷的幾種後端語言

  • 2019 年 10 月 20 日
  • 筆記

前言

談這個話題,沒有任何語言之爭,只是個人開發的經歷。

適合

開發語言的選擇只是當時條件下適合每個項目或者每個團隊乃至每個公司的最佳選擇,並不是說XXX公司也用這個我們用這個肯定沒問題。
當時還在某手機公司,有次跟某公司後端leader聊天的時候,我說我們現在一些高並發的場景的項目都在用lua開發,那哥們說了幾句,你們XX手機現在都流量這麼高了,Facebook 微博都在用PHP開發,你們的量都超過微博了。然後,後面沒法聊了,不知道該怎麼接這茬了。大家都了解的是,Facebook在很多年前已經開發了HHVM來優化PHP的性能,對PHP的了解和熟悉已經將PHP用到了極致了。微博也一直在用PHP,鳥哥在微博作為技術專家工作了很多年,後面微博PHP的版本升級也有鳥哥兜底,所以這種大型的公司,不管使用何種語言都有會資源上的保證,小公司是沒法比的。
所以選擇適合的語言,有適合的人和資源保證,才是王道,公司和個人心裡才有底。
我們公司現在是這樣選擇的,後台管理系統一般用PHP開發,前台的一些簡單項目比如短連接服務、跳轉服務等等的都使用lua開發,中間件項目,服務項目抽獎、插屏、消息服務等使用GO開發,當然了,主要對外的幾個高訪問量的項目也使用GO開發。LB上的安全防火牆也是使用lua開發的。
原則就是,對外的高訪問量的項目和中間件的項目使用GO開發,簡單項目,LB上的需求都是使用lua開發,後台管理系統使用PHP開發。

PHP

PHP這門語言,應該是算我開發時間最長的語言了。專門的WEB開發語言,優秀的開源框架、開源項目數不勝數,開發便捷,容易入門,是中小型公司熱衷的選擇。還有PHP的新版本7.X之後對性能成倍級的提升,加上高性能的非同步並發的通訊網路服務swoole的加持,讓PHP換髮出了第二春,性能上對80-90%以上的項目已經不存在問題了。當時我們支付系統使用的swoole,確實解決了很多痛點。到現在,項目的選擇都是優先想到PHP。
原來的公司有個訪問量比較高的應用,每天3K萬的請求量,到現在還是使用的PHP,使用了四台機器,兩台機器提供API,兩台提供後台服務,性能上一點問題也沒有,即使將來性能上有問題了,加一兩台機器,再抗幾年也是沒問題的,出過幾次事故,都是MySQL的問題,跟PHP本身沒有任何關係,還有很多項目每天幾百萬的請求量,都是PHP開發的。所以前面說了,80-90%以上的項目根本不會有性能的問題。
高並發大流量的場景還是有些限制的,比如搶購秒殺等等。我們每次新品發布的時候,前面階段加上限流,邏輯上為了達到每秒3000多單的下單率,每次活動前,都需要把機器從平常兩三台加到8台,來滿足3000多的下單率。

lua

lua作為後端語言,主要是指OpenResty。OpenResty是一個基於 Nginx 與 Lua 的高性能 Web 平台,其內部集成了大量精良的 Lua 庫、第三方模組以及大多數的依賴項。用於方便地搭建能夠處理超高並發、擴展性極高的動態 Web 應用、Web 服務和動態網關。簡單的將openresty的lua理解成Nginx就可以了。
之前也研究過一段時間的openresty,但都處在學習和練手的階段,沒有開發過生產的項目。使用lua開發高並發的項目,是因為當時有個項目,困擾了我們很長時間。大概是這樣的,每天凌晨0-2點,會把昨天的日誌打包上傳到伺服器,每天的這個時候,四台的機器的負載都在80-90以上,服務基本上處於不可用的狀態,過了凌晨2點,服務慢慢就會恢復,想了很多辦法都未能解決這個棘手的問題。後來就嘗試使用lua將項目重寫了下,寫完之後就灰度發布到一台機器上了,觀察了一段時間,發現這台機器在0-2點負載最高是5,基本上解決了我們的問題,觀察經過了安全期後全部發布。下面是當時修改之後的監控數據的截圖,修改之前的截圖找不到了。
在這裡插入圖片描述
後來就深入研究了openresty,找一些開源的框架,發現了vanilla,Vanilla是一個基於Openresty實現的高性能Web應用開發框架。後來的一些高並發的項目或者介面就使用lua重構了一次。整體上還是比較滿意的。

golang

golang的語言的使用應該算是一個水到渠成的事情。前期一些高並發的項目都是用lua開發,優點是解釋型語言,寫個小的項目或者網關上waf類的項目,可以說相當適合,即改即生效,網關上拉個黑名單,限流限頻調整配置等等。弊端也越來越明顯,面向對象是使用lua的metatable實現的,很弱很弱,手誤或者寫錯或者有BUG很難及時的定位到,有問題了經常需要調試老半天,或者寫一兩天程式碼需要半天時間調試,相當影響開發效率和定位問題的效率。急需一種新的方案來解決高並發的場景,然後Golang就騎著大白馬來了,當時可選方案很少,只有Java和Golang,團隊成員都是PHP出身的,轉戰Java的代價太大成本太高。相比之下,Golang就容易的多,入門簡單,專為為高並發而生,他爹Google又令人這麼放心。唯一擔心的就是,原來接觸的PHP Lua都是解釋型語言,寫遊戲的時候倒是使用過幾年actionscript3,但是寫客戶端程式和寫伺服器程式是有天壤之別的。使用了Golang之後覺得擔心是多餘的,相當順手,現在是越來越喜歡了。寫了一天程式碼之後下班的時候編譯一下,解決掉幾個編譯錯誤之後基本上就沒其他問題了,第二天測試下就可以發布了。使用解釋型語言的時候哪有這麼順利過,一般得調試老半天,一度都以為自己半年來技術都牛逼到這個程度,差點都離職去面試阿里的P10了,O(∩_∩)O哈哈~。直到使用解釋型語言的時候就回到現實了,自己還是以前的哪個自己…… 總之,挺好用的,值得嘗試下。

技術人得有點追求

很多年以前,我們的技術負責人說過一句話,我們問,PHP+MYSQL已經能滿足80-90%的項目需要,為什麼還有那麼多人和小公司去冒著風險去嘗試新的技術、新的語言,新的非同步方式、新的消息隊列,他說過的話至今記憶深刻,你們說的都對,但是技術人得有點追求啊。
多嘗試,只會有好處沒壞處。一些小的獨立的項目試試新的實現方式,效果也許會令人大吃一驚,更優的解決方案就慢慢呈現出來了。