1.skynet pomelo(node.js) elixir(erlang) 周末研究總結 手游這兩年發展來看,感覺對實時性要求越來越高,有同事在研究Elixir開發,google得知這東西是基於erlang搞出來的,語法類似ruby; 公司現在客戶端采用全cocos2d + c++ + lua,新項目unity3d + c# + lua, lua在產品開發中使用比較頻繁,同事了解程度也比較深; 完美情況下自然最好是服務端也使用lua開發,之前就經常發生在服務端ruby代碼中寫lua的囧像。 周末花了兩天時間做了下研究,關於高性能服務器架構的知識;無非就是高性能io處理,多進程多線程模型,透明化分布式,腳本熱更新 etc 這些東西; 關於io處理 epoll和windows的iocp,對比select模型,效率對比就是輪詢一堆端口:o(n)跟直接注冊回調:o(1)的差別; pomelo: 內部使用websocket或者socket.io的實現,內部也是使用epoll實現 skynet: 同樣使用epoll/kqueue實現,代碼在socket_epoll.c socket_kqueue.c erlang:同skynet 據說erlang 處理1百萬個空tcp鏈接很輕松,這塊幾個研究對象區別不是特別大; 關於進程線程 pomelo:單進程單線程模型,具體原因是node.js的實現就是這樣的; skynet: 多進程多線程模型; erlang: 單進程多線程模型; pomelo進程之間通信是通過socket完成(包括同機),每個進程中都有一個消息循環,rpc都是異步完成,可見效率一般; skynet是單進程內預制n個線程,每個服務有自己的消息循環,沒消息的時候掛起,有消息的時候,選擇一個線程來跑服務,消息隊列的消息投 遞使用原子鎖;處於同進程內的服務間,消息通信效率還是比較高的,消息可以拷貝也可以不拷貝,建議拷貝; erlang封裝了自己的進程概念,實際上類似skynet(其實是skynet借鑒了erlang vm),每個進程對應的是操作系統線程, 綜上,erlang的設計很好,所以skynet也借鑒了設計,但是介於lua開發的方便性,個人更傾向於skynet; 關於透明化cluster: 這點做的最好的是erlang,因為它在語言層面上就不需要關心物理機器,進程這些東西;skynet在這方面跟pomelo差不多,還是需要關心物 理機; 關於熱更新 erlang和skynet都是可以實現熱更新,pomelo新版本中能實現某些邏輯關系不復雜的模塊熱更新; 其他:lua的coroutine的方便之處,在異步的操作過程中,一般做法就是調用-》回調-》調用-》回調…,這種嵌套的調用代碼書寫很麻煩,使用協程可以方便的在一個函數內實現異步調用,掛起等待結果回調的同步效果;