標籤:
給自己一條退路,再次比較Erlang和Golang
2014-6-28
陳葉皓 [email protected]
雨天的周末,適合碼字的時節。。。
一年前我開始學習go語言的時候,如獲至寶,既有python的編碼效率,又帶來效能的15倍提升。尤其是在非同步編程方面,可以使用channel同步線程,不必加鎖可以充分利用cpu多核計算,真是沒有弱點。
後來慢慢瞭解到,這種無鎖非同步編程的思想,源自一門叫做erlang的語言,Erlang更加了不起。除了非同步編程之外,這門語言天生支援分布式,單機上開發的軟體,可以不加修改地運行在叢集上,另外還支援軟體版本的熱升級,內建的OTP架構支援進程間的監督和重啟,提供了堅如磐石的運行環境。Erlang是如此完美,我認為是最適合開發互連網應用的語言,一時間有種“終於找到真理”的喜悅。
不過那個時候,心裡總覺得有什麼地方不對,那就是,七牛CEO許式偉本身是Erlang高手,他卻為自己的公司選擇go語言,七牛成為一家只使用go語言進行開發的公司。
最近幾天隨著erlang學習的深入,慢慢找到了答案。Erlang實質是一門動態語言,它的動態類型,動態函數調用,都充分表現的動態語言的特徵。Erlang是一個運行在虛機裡面的動態語言,其實也不奇怪,只有動態語言,才容易實現軟體版本的熱升級。那動態語言有什麼缺點,就是慢,動態語言因為時刻要進行類型推導,執行速度就是要比靜態語言慢好幾倍,所以,erlang自身所做的最佳化,就是儘可能把常用的功能用c語言實現,整合到erlang的虛機內,至於程式員編寫的代碼,也只能慢慢地執行了。
所以erlang適用的情境是,高並發且計算不密集,例如whatsapp,使用erlang編寫,千萬使用者同時線上,高並發的典型情境,但是使用者之間發送訊息是不密集的,一個人打字能有多快,這個情境就特別適合erlang。
許式偉早就明白,七牛要提供的圖片雲端儲存,時刻需要大塊磁碟IO,圖片即時縮放需要大量CPU計算,選擇靜態語言go語言,可以提高效能,減少伺服器的購買。
“世間安得雙全法,不負如來不負卿”,高並發和密集計算其實是一對矛盾,當cpu服務於密集計算,自然無暇響應更多的請求。當然可以使用erlang搭建互連網服務,響應高並發地請求,然後把計算轉移到cpu閒置節點上,然而那些計算節點,如果是用靜態語言(比如go語言)編寫,會獲得更好的效能。
在設計軟體時,微觀上,要識別哪些可以並發,哪些必須串列。宏觀上,要識別哪些是IO密集,哪些是計算密集。永遠沒有標準答案,正是這個行業的魅力。
比較總結:
Erlang的優勢,其中的2,3,4並沒有別的語言可以匹敵
1. 高並發,非同步編程的鼻祖,寫並發代碼很簡單
2. 支援叢集
3. 健壯(OTP的進程監督機制)
4. 代碼熱升級、熱復原
Go語言(scala,F#類似)的優勢,
1. 高並發,支援非同步編程
2. 高效能(靜態語言的優勢)
http://blog.sina.com.cn/s/blog_6e1bd8350102uwgl.html
【Go】為什麼用go; Golang Erlang 前世今生