手機遊戲伺服器端用node.js 還是用go,fibjs之類等比較好?

開發手機對戰遊戲的伺服器(客戶端是cocos2d-js.使用websocket通信),

用c++開發太重了,要考慮開發效率和學習成本,最重要的是未來趨勢。


我沒有用 Go 做過服務端。但是長期使用 node.js 和 Erlang/OTP。我只談談我這幾年的經驗。

快速原型開發 node.js 可以。但是作為服務端長效運行的程序,node.js 那點可憐的特性實在是不值一提。建議用 Erlang/OTP,原因如下:

  1. 根本無需顧慮並發。很多人談 Erlang 都必談並發,但其實 Erlang 真正的價值是可以把並發模型完全抽象掉,你只需要寫順序代碼即可。這個特性在 Erlang 中稱為 behaviour,本質是一種介面技術,其內置了一些典型的服務模型例如 gen_server,因此你可以更專註於實際的業務需求。node.js 可以部分掩蓋掉並發問題,因為它使用了一個事件隊列來將並發的請求轉為依次處理,這使得我們不需要考慮並髮帶來的鎖相關的問題(進程內而言),真真是極好的,但可惜由於整套機制建立在非同步回調之上,導致代碼碎裂得很厲害。即使依託於 Promise 之類的庫,也只是稍有改善,維護成本與 Erlang 沒有可比性。(為了解決這個問題 fibjs 採用了一個和 node.js 完全不同的模型,更類似 Erlang 值得關注)
  2. 能夠自適應垂直擴展。隨著在線人數增高,伺服器需要同時完成橫向擴展和垂直擴展。垂直擴展說白了就是更多 CPU 核心,更大內存,更強勁的磁碟。這些問題 node.js 有可憐的基於多進程的解決方案,為了跑到最佳性能,你要做的事情其實不少,而且限制也很多。但是 Erlang 不存在這方面的問題,絕大多數情況下,自適應是悄然完成的,為什麼?因為你在寫程序的時候就已經把整個系統分解成了許多的進程,它們可以自動的被調度到不同的 CPU 核心上執行,例如曾有程序員聲稱在 128 核心的 CPU 上,Erlang 可以達到 80% 的利用率,而這是 Erlang/OTP R15 時候的情況,如今利用率只高不低。
  3. 保證極高的容錯和可用性。基於 Erlang 開發的系統可以達到 99.9999999% (9個9)的可用性。當然這是極端調優後的結果。一般水平的 Erlang 開發人員無法做到。不過 Erlang 的 OTP 框架提供的容錯模型確實是驚人的。即使是初級水平的程序員也可以寫出高容錯的系統。這主要依賴於幾點——基於函數式,無狀態;鼓勵程序員使用大量的進程來將錯誤隔離;內置的 Supervisor 監控樹可以自動完成異常監控以及自動按策略重啟;等等。node.js 也有一些簡單的 Supervisor 庫。勉強能用,但不在一個級別。
  4. 可以對系統進行熱更新,而無需停機。這一點其實通過一些技巧可以在 node.js 中實現。因為所謂熱更新,無非就是載入新的代碼,替換掉當前正在運行的代碼而已。但由於 JavaScript 本身有狀態的特點,必須滿足許多條件才能保證這種熱更新是無害的。否則將導致大量的問題。Erlang 因為無狀態,可以保證模塊在不停機的情況下安全更新。至於更新過程里涉及數據方面的問題(例如格式變更),也有比較妥善的解決方案。

你有沒有發現這些都反映出 Erlang 其實是對企業而言高效而低成本的方案?可以省錢啊同志們。

當然,Erlang 並不是萬能的。在基於網路的服務處理方面,它幾乎是無敵的。但是在很多方面,反而不如 node.js 好用。特別是圍繞 Web 開發的許多方面。使用 Erlang 搭建高性能 Web 伺服器沒問題。但是 Web 目前大量依賴於各種模板技術,以及在流程方面變得越來越複雜(層層編譯、轉換、合併),這方面 node.js 有大量優秀便捷的庫。而 Erlang 則貧乏很多(也可能是我孤陋寡聞,歡迎指正)。

綜上所述,Erlang 是更佳的方案,然而……招人是個問題,另外團隊協作也是需要考慮的,這些都制約了 Erlang 的使用。至於問題中提到的 Go,說實話我關注過,但是並未在工作中實際使用。這方面的回答還是留給其他有經驗的人來回答。

最後說一句——你就使用你最熟悉的工具先把初期的原型做起來就好,但是可以循序漸進的採用更優的方案去替換掉目前的方案。一步到位是不存在的。


我來回答一下:當然是 fibjs 啊!!!!!


邏輯寫法: node.js是非同步單線程, golang是同步多線程

非同步寫多了會精神分裂

同步是 真 人思維


你會什麼語言,就用什麼語言。

新鮮的東西不一定好,還是最熟悉的成本低效率高。


go


如果有其他選擇,別用Node.js,沒有選擇的話Node.js湊合用著吧,用Node.js你的業務邏輯會IO分割的支離破碎,寫這些代碼的時候已經很難受了,維護起來你自己想想吧。

Node.js發生內存泄漏找起來也是好難受的。

協議選擇websocket並不是太明智,你知道移動網路並沒有你想的那麼快,別上線了才發現卡的要死,想著要換協議,或者壓縮協議,並不是那麼舒服的事情。

順便黑一下學了Node.js就號稱全棧工程師的人,他們是不可靠的。

未來趨勢絕對不是Node.js這種一個回調接一個回調的玩法,太反人類。

選擇你擅長的,你擅長Node.js就用Node.js吧,雖然我黑了那麼多。

說一下,我用過比Node.js好的方案(至少寫起來好,別和我說什麼性能,大多手游服務對性能並沒有太高的要求)

python+ gevent + protobuf

雲風的skynet


反正啊,盡量少用js...

非同步會讓你求生不得,求死不能。

go不錯。


小項目用 Node.js ,大工程用 Golang .


有沒有node.js遊戲開發同學,可以拯救一個HR,不然HR就要轉型做程序猿啦。。。。


這三種語言都能很好的實現業務邏輯,實現起來的難度應該算在一個數量級之內,就不需要比較了。

寫遊戲伺服器,到最終都是在優化性能,最影響性能的是GC,至於這仨貨的GC性能怎麼樣,樓主可以結合自己的情況模擬一堆數據實際測試一下,做個對比。在2G以上情況下,Go1.5和Node的差距已經相當顯著了。

同然前提是Node和Go的代碼質量是同樣的,Go數據的結構設計的好,對GC有很大影響。

PS1:可能有人會說慢IO的問題,這仨貨已經都解決了慢IO的問題,雖然解決的方式不太一樣,效率有差別,但是在現在的大多數應用場景中,特別是遊戲伺服器,各種外部的慢IO已經不是瓶頸了。


我覺得nodejs就是玩具和佐料。。。可憐前端覺得他是神器和美食。。。


gogogogo


go


強烈不推薦node,非同步一開始用覺得很爽,但真開發起來了,到處是坑。還不如用Python。


node 32bit 內存使用不超過700M 64bit 不超過1.7G 所以註定不可能做太大型的強聯網遊戲 比如MMORPG 這種 卡牌什麼之類的倒是可以。 不過我傾向於 用node 做一些周邊工具。

go 沒有oop 不夠甜 搞起來不爽。

python 甜 但是性能不爽。

所以要是弱聯網什麼的 node python 都可以。 要是大型MMORPG的話 還是建議 java 或者 C++ 。

當然我自己用 pascal.


去看下網易的pomelo網遊伺服器框架,node寫的。

網易在國內的網遊研發能力,不需要我說了吧。


推薦閱讀:

Node.js 真的不適合大規模開發嗎?
Node.js 發展前景如何?適用於哪些場景?
nodejs 應該學習哪些框架?
什麼是 GraphQL?

TAG:伺服器 | Nodejs | Go語言 | fibjs |