讀《談分佈式網絡程序設計》,思Erlang

163的zhousen寫了幾篇文章,《談分佈式網絡程序設計》
[url]http://q.163.com/dirgroup/blog/zhousen.zju/1802920067811231290/#1802920067811231290[/url]
[url]http://q.163.com/dirgroup/blog/zhousen.zju/1802920067123113984/#1802920067123113984[/url]
[url]http://q.163.com/dirgroup/blog/zhousen.zju/18029200672093930660/#18029200672093930660[/url]

簡單談談感想。

1.網絡數據的收發的設計方式
文中說:
[quote]使用select,一個線程專門負責所有的連接的接受和發送[/quote]
[quote]通常在高性能的服務器程序則使用的是第二種方式,佔系統資源少,而且性能也很好。此外,流水線技術是目前cpu中最基本的技術之一,若將此用於網絡程序設計,也可以大幅提高性能。它在網絡程序中的表現實際上就是使用隊列,若請求的處理過程分好幾步,那麼在每一步都設置一個隊列,性能比將大大提升。cpu的流水線技術的原因在於各個部件都處於繁忙狀態,所以cpu單位時間內處理性能提高。而網絡程序採用流水線技術(隊列)則能儘量促使各個節點處於繁忙狀態,從而提高程序的性能[/quote]

這種做法,目前我從事的項目也在使用,將邏輯轉換爲大量的Task,然後放在多個線程中以流水線方式執行,以此充分利用CPU。但是這種方法存在問題,就是將對於每個連接,本應按照同步進行處理的邏輯,拆成了異步執行,在調錯方面存在難度,而且程序也複雜了難於理解。如果使用Erlang,大可以一個Process對應於一個連接,由於Erlang的進程調度都是在用戶態完成,因此能夠最大化使用CPU,而且調試等也是很方便。

作者說了三個問題,超時,鎖,網絡發送瓶頸。在我的項目中,也碰到了超時和鎖的問題。如果使用Erlang,鎖和網絡發送瓶頸的問題,都很好解決。消息通訊機制,不再需要鎖;發送瓶頸,Erlang中可以一個Process對應於一個Socket。對於超時,可以在Process中監測一個Task處理的時間,彙總後計算。


2.網絡協議
無論使用什麼語言開發分佈式網絡程序,協議這方面都需要下功夫,只是Erlang在通訊的層面提供了很大的便利,可以省不少功夫。

3.字符編碼
Erlang在字符編碼這方面的支持是比較薄弱的。文中提的是Java和C++通訊,如果換成Java和Erlang通訊,在這方面需要謹慎處理。
舉個想到的例子,比如Java端要發送一個含中文字符串的數據包到Erlang端,使用 Length + Body 的格式發送,那麼Java代碼就需要計算出正確的Length,使用 getBytes("UTF-8") 來獲得字符串長度,Erlang代碼要使用 iconv 來將二進制流編碼爲正確的UTF8串。

4.字節序
“通過網絡字節序進行傳輸”這個確實是最好的辦法。

5.單元測試
Erlang也有單元測試的,可以看看 wiki.trapexit.org 上面的 Test Driven Development 一文。

6.集成測試
啥系統都要做的,避免不了的,不多說了。

7.內存測試
有VM的語言就勝在這方面,但是糟糕的程序也一樣會造成內存溢出。Erlang就要注意Atom表的問題,此外一些set,dict也要注意容量別太大了,超過系統內存,會拋出一個錯誤的,我碰過這個。另外Erlang的內存模型是私有堆,理論上回收效率,延時等方面,可以比Java這樣的命令式語言的VM做的更好。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章