網站服務器和游戲服務器是怎麼樣聯系到一起的?
1. 游戲分很多種,咱們先來看看MMORPG。
再怎麼簡單的RPG服務器都免不了處理多人交互的情形,上百人在同一個場景裡面,每個客戶端都需要收到其他所有人的操作信息。
其次,用戶的操作是非常頻繁的,一般的服務器傾向於持有長連接。而且這些鏈接的是頻繁交互的,沒有明顯的持久的分區策略,所以限制了服務器的橫向擴展,同一個場景往往只能放在一個物理機上面運行。
再次,端游通常是不敢把邏輯運算放客戶端的,用戶分分鐘給你破解掉,改改金幣,刷兩件裝備再常見不過了。所以這一台地圖服務器得驗證地圖內所有玩家的操作,並計算怪物AI、掉率等一系列業務邏輯。
我們可以看到,傳統游戲服務器與網頁服務器具有明顯的區別,具有長連接、多廣播、有復雜的業務邏輯、分區策略受限等獨特的業務需求。
2. 咱們在來看看並發帶給游戲服務器的好處是什麼。
並發實際上是一種程序邏輯流程,他是不需要多核物理支持的。大致意思就是讓多個獨立的邏輯流看上去像是在同時跑一樣。操作系統級別的並發就是多進程多線程模型。讓OS處理時鐘中斷,i\o阻塞等等問題。
對於 服務器 而言,如果任務大部分的時間耗在i\o上,有了並發機制可以避免整個地圖服務被i\o訪問阻塞。一個任務阻塞的時候,把空余計算資源分配到其他任務上去。在這種情況下,並發是有益於服務器運行效率還有響應時間的。
對於程序員而言,獨立的邏輯流意味著可以在一個可靠、簡單、松耦合的上下文環境裡面,完成自己的任務。
因為讓OS處理程序邏輯切換得反復陷入內核,有的人覺得這樣太慢,做了一些處於user space的線程,進程內自己控制多個邏輯流。因為語言描述能力的限制,在C/C++上面寫還有用這種東西都太麻煩。於是產生了erlang, go, lua裡面的coroutine語法糖。
node.js本質上也是自己控制多個邏輯流,但是這個邏輯流是根據i\o狀態還有優先級分發的。在實際的實現中,它盡量采用非阻塞異步i\o,單個任務調用i\o的時候,我就停掉它,等i\o完成的信號發上來了,我再重啟它。
注意這一點,每次我會運行一個任務,直到它完成或者是發生i\o調用都不會主動切換至其他的程序流。那麼如果這一個任務裡面涉及過於大量的計算,那麼整個地圖進程都會被block在這裡。
而正因為node.js是異步的,所以需要不斷的寫回調監聽i\o完成的信號。單個任務的邏輯流會多次的被打斷。當任務變得相當復雜的時候,即有所謂的callbak hell,會帶給調試開發非常大的麻煩。
3. 因為上面的原因,所以我不建議在非原型的MMORPG服務器開發中使用node.js。
4.最近興起的手游服務器倒是挺適合node.js,因為手游這玩意局限於網絡問題,服務器只能做關鍵數據驗證,也沒辦法處理特別多人交互的情形。服務器端已經簡化得跟網頁服務器沒啥區別了,業務邏輯也簡單,處理處理數據,然後持久化就成。