一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Node.js之網(wǎng)游服務(wù)器實(shí)踐

 _src_ 2022-12-30 發(fā)布于四川

此文已由作者堯飄海授權(quán)網(wǎng)易云社區(qū)發(fā)布。

歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。

隨著Node.js的不斷發(fā)展與壯大,應(yīng)用范圍也越來越廣泛,從傳統(tǒng)的企業(yè)應(yīng)用,到互聯(lián)網(wǎng)使用,再到云計(jì)算的發(fā)展,它的身影也是隨處可見。當(dāng)然,它的受歡迎程度能在短時(shí)間內(nèi)得到這么快的發(fā)展,除卻與其本身的事件模型及V8的性能優(yōu)化等一系列特性有關(guān)之外,還和國內(nèi)外很多互聯(lián)網(wǎng)公司的攻城師的大量應(yīng)用和參與到開源項(xiàng)目中有密切關(guān)系,如網(wǎng)易的游戲開發(fā),淘寶的數(shù)據(jù)之美等等。隨著HTML5應(yīng)用和移動互聯(lián)網(wǎng)平臺的指數(shù)增長,越來越多的用戶使用了移動平臺的休閑服務(wù),采用 Node.js 實(shí)現(xiàn)高性能和可擴(kuò)展性的游戲服務(wù)將是一件有意義的工作。

在互聯(lián)網(wǎng)上,目前有一些采用 Node.js 實(shí)現(xiàn)的開源游戲服務(wù)框架,如 Mozilla的 Browser Quest , Google的 Grits ,Chilly等。但是無一例外,這些框架不但與游戲邏輯聯(lián)系緊密,而且?guī)缀鯖]有可擴(kuò)展性和性能數(shù)據(jù),同時(shí)也不提供任何游戲開發(fā)的管理工具,除了采用 JavaScript 編寫外,很難體現(xiàn)出采用 Node.js 實(shí)現(xiàn)游戲開發(fā)的優(yōu)越性。

概念

通常游戲分為角色扮演類和策略類及混合類等幾種游戲類型。那么在網(wǎng)頁游戲類型中,根據(jù)游戲的類型,開發(fā)者可能采用不同的架構(gòu)實(shí)現(xiàn)方式,如策略類游戲可能更偏重于游戲的策略性和邏輯性,也就是考驗(yàn)游戲玩家的各種組合或搭配之類的游戲,對實(shí)時(shí)性的要求不會很高,在用戶的可接受范圍之內(nèi)即可,因此也可以采用常用的Web應(yīng)用開發(fā)模式來實(shí)現(xiàn),而客戶端采用輪詢或長連接等方式來實(shí)現(xiàn),這些應(yīng)用模式也有很多的相關(guān)經(jīng)驗(yàn)可以參考,因此能做到具有較好的可擴(kuò)展性及伸縮性;此外,應(yīng)用服務(wù)器和服務(wù)框架等也可以采用現(xiàn)存的技術(shù)實(shí)現(xiàn),但是這只能滿足對游戲?qū)崟r(shí)性要求不高的場景服務(wù),由于此類的應(yīng)用方案非常成熟,在下文的討論中,將不再詳述。

角色扮演類游戲根據(jù)策劃的要求可以實(shí)現(xiàn)各種各樣的功能,如聊天,打斗,自動刷怪等各種復(fù)雜的功能,但是開發(fā)者基本可以把這些功能抽象地劃分為二大類,即服務(wù)端的網(wǎng)絡(luò)傳輸與邏輯運(yùn)算能力,這樣游戲服務(wù)的開發(fā)和實(shí)現(xiàn)會稍微簡單些?,F(xiàn)在,網(wǎng)絡(luò)的實(shí)時(shí)傳輸基本上是采用Socket服務(wù)器來實(shí)現(xiàn)的,邏輯運(yùn)算這個(gè)就不需要再述了,因此,游戲服務(wù)器就可以粗略的歸納為Socket的服務(wù)器綜合游戲業(yè)務(wù)邏輯的實(shí)現(xiàn)。

與Web應(yīng)用區(qū)別

從上面游戲服務(wù)的概念簡單介紹中可以得知,實(shí)時(shí)游戲服務(wù)器的開發(fā)與傳統(tǒng)的Web開發(fā)還是具有一些不同點(diǎn),這些不同點(diǎn)著重體現(xiàn)在以下幾個(gè)方面:
大部分的Web應(yīng)用還是短連接的方式去實(shí)現(xiàn),而游戲的實(shí)時(shí)性需要采用長連接的方式進(jìn)行。

Web應(yīng)用的場景一般是讀多寫少的應(yīng)用,熱點(diǎn)數(shù)據(jù)基本可以緩存;游戲服務(wù)的數(shù)據(jù)經(jīng)常發(fā)生變動,如移動中的路徑,打怪掉血等,緩存基本很快就失效,屬于寫多讀少的應(yīng)用場景。

廣播特性,即Web應(yīng)用行為上基本只需要用戶與服務(wù)器交互,其他用戶要實(shí)現(xiàn)共享他人信息的時(shí)候,會采用類似拉的方式如長輪詢來實(shí)現(xiàn)數(shù)據(jù)交互,即使在沒有數(shù)據(jù)更新的狀態(tài)時(shí)也需要消耗一定的服務(wù)端資源,造成一定的浪費(fèi);游戲里面的交互方式需要實(shí)時(shí)進(jìn)行,對影響三方的數(shù)據(jù),必須采用廣播的方法進(jìn)行消息推送,即推的模式。

目前的Web應(yīng)用開發(fā)一般采用無狀態(tài)性的方式來實(shí)現(xiàn),因此可以實(shí)現(xiàn)較好的可擴(kuò)展性,很多Web服務(wù)會采用綁定會話或集中會話等方式工作,當(dāng)后面的某臺服務(wù)器出現(xiàn)宕機(jī)時(shí),服務(wù)也可以很快的切換;但是游戲服務(wù)器和用戶之間的連接是有狀態(tài)的,在斷開時(shí)需要進(jìn)行相關(guān)的通知和數(shù)據(jù)持久化,在重連時(shí)需要進(jìn)行狀態(tài)恢復(fù)等手段來維護(hù)游戲世界的運(yùn)行。

除以上幾點(diǎn)不同之外,還有負(fù)載均衡的策略,服務(wù)驅(qū)動方式,系統(tǒng)判定,系統(tǒng)安全如外掛作弊等相關(guān)問題,文章中不再對他們進(jìn)行對比說明。一般來講,根據(jù)游戲的規(guī)模與需求,通常游戲服務(wù)器的實(shí)現(xiàn)的模式會使用如下的三種架構(gòu)方式來實(shí)現(xiàn)。

單進(jìn)程服務(wù)架構(gòu)

圖1 單進(jìn)程服務(wù)架構(gòu)

圖1是目前互聯(lián)網(wǎng)上的很多游戲服務(wù)器使用的架構(gòu),比如商用的SmartFoxServer游戲服務(wù)器,開源的有Google的 Grits, Mozilla的 Browser Quest等框架。所有的程序在同一個(gè)進(jìn)程里面運(yùn)行,架構(gòu)簡單,開發(fā)人員上手快,開發(fā)和調(diào)試非常方便又快速,成本較低,后期的維護(hù)成本可能隨著游戲項(xiàng)目的大小而不同,但是整體應(yīng)該不會太高。很明顯,游戲的世界是在同一個(gè)進(jìn)程里運(yùn)行,在單個(gè)場景都有不少在線用戶的時(shí)候,如果采用單進(jìn)程的 Node.js 實(shí)現(xiàn)的話,每個(gè)用戶的操作可能會有一定的延遲,特別是在大量用戶同時(shí)做大量操作與AI運(yùn)算時(shí),如服務(wù)端尋路和自動殺怪,延遲會更加嚴(yán)重;同時(shí)單進(jìn)程對計(jì)算機(jī)資源使用有限。因此只適合游戲的原型制作或小型的游戲開發(fā)。另外,由于游戲的狀態(tài)與復(fù)雜性,也無法較好的實(shí)現(xiàn)游戲的可擴(kuò)展性,基本只能通過添加游戲服務(wù)器的方式來實(shí)現(xiàn),即所謂的開新服,而這些用戶之間是無法在同一個(gè)世界里通信會話和交互的。盡管Node.js支持原生的TCP服務(wù),使用簡單;但是目前大部分網(wǎng)絡(luò)應(yīng)用中,尤其是支持HTML5的應(yīng)用,由于性能較好并且使用簡單,成為大部分應(yīng)用采用的網(wǎng)絡(luò)庫來實(shí)現(xiàn)高性能websocket服務(wù)。在移動互聯(lián)網(wǎng)應(yīng)用中,由于協(xié)議較復(fù)雜與通信數(shù)據(jù)等問題,需要一定的裁減。下面示例中,就是最簡單的單進(jìn)程服務(wù)的原型:

  1. var socketio =
  2. require('');
  3. var io =
  4. socketio.listen(8080);
  5. io.sockets.on('connection',function(socket){
  6.      socket.on('disconnect',function(){
  7.      //user leave
  8.      });
  9.  socket.on('message',function(msg){
  10.      if (getLoginStatus(socket)) {
  11.     game[data.action].apply(null,[socket,msg]); 
  12.      } else {
  13.      game['login'].apply(null,[socket,msg]); 
  14.      }
  15.  });
  16. });

多進(jìn)程服務(wù)架構(gòu)

圖2 多進(jìn)程服務(wù)架構(gòu)

在上圖2中,我們可以看出,每個(gè)進(jìn)程負(fù)責(zé)采用單一職責(zé),各進(jìn)程間通過一定的規(guī)則(如RPC遠(yuǎn)程過程調(diào)用)來進(jìn)行通信,游戲中的各場景服務(wù)使用一個(gè)進(jìn)程來服務(wù),實(shí)現(xiàn)各場景游戲運(yùn)行的分離。但是在開發(fā)過程中,不需要考慮每個(gè)場景具體的信息,全部采用統(tǒng)一的代碼來實(shí)現(xiàn),開發(fā)方便,通過添加適當(dāng)?shù)膮?shù)來實(shí)現(xiàn)較易的調(diào)試,每個(gè)進(jìn)程分別運(yùn)行在服務(wù)器的多核上,即可以充分使用計(jì)算機(jī)的資源,也由于職責(zé)單一,由于每個(gè)進(jìn)程都專職做自己的事,因此,在壓力大的時(shí)候,可以很明顯的查出問題所在,并可以較好的實(shí)現(xiàn)對相應(yīng)的服務(wù)進(jìn)行調(diào)優(yōu),可以達(dá)到較好的性能和一定的可伸縮性。但是,在各游戲的世界里,無法準(zhǔn)確的知道游戲的狀態(tài)如在線人數(shù)之類的,會存在熱點(diǎn)數(shù)據(jù)和服務(wù)過載等一些問題,造成部分服務(wù)堵死等現(xiàn)象,也無法達(dá)到在不停服務(wù)的情況下進(jìn)行服務(wù)器擴(kuò)容與自動切換等問題,同時(shí)會給游戲運(yùn)營帶來一定的問題,不能充分的對玩家數(shù)據(jù)進(jìn)行分析與挖掘,因此,這種實(shí)現(xiàn)方式可以滿足中小型的游戲開發(fā)。這種架構(gòu)目前很多的游戲服務(wù)器中還在使用,技術(shù)發(fā)展也較成熟,如傳奇服務(wù)端架構(gòu)等。

分布式服務(wù)架構(gòu)

圖3 分布式的服務(wù)架構(gòu)

同樣,分布式的服務(wù)架構(gòu)與多進(jìn)程的架構(gòu)具有很多相同點(diǎn),如進(jìn)程服務(wù)單一職責(zé),較好的性能調(diào)優(yōu),同時(shí)采用集中式的方式對游戲服務(wù)器進(jìn)行管理,各游戲服務(wù)器可以通過自定義的方式即DSL進(jìn)行游戲業(yè)務(wù)的路由與分發(fā),通過主備服務(wù)器的狀態(tài)可以很清楚的知道每個(gè)服務(wù)的狀態(tài)及運(yùn)行情況,這樣可通過動態(tài)添加服務(wù)來到達(dá)負(fù)載均衡,具備較好的性能和可擴(kuò)展性,能滿足大型游戲的開發(fā)。當(dāng)然,采用這樣方式,會具有一定的復(fù)雜性,同時(shí)各服務(wù)之間可能是不在同一臺服務(wù)器上的,因此會帶來一定的網(wǎng)絡(luò)開銷,在大量廣播的場景中,網(wǎng)絡(luò)IO壓力大,需要通過定時(shí)批量或AOI服務(wù)等方式來進(jìn)行廣播通信,同時(shí),游戲的通信協(xié)議需要經(jīng)過特別的設(shè)計(jì),盡量避免數(shù)據(jù)序列化上的CPU重復(fù)開銷,采用胖客戶端的方式去分擔(dān)游戲服務(wù)器的序列化與反序列化;另外還有可能引入分布式事務(wù)等相關(guān)問題,需要在一個(gè)集中點(diǎn)進(jìn)行處理。當(dāng)然,在游戲設(shè)計(jì)中,策劃開發(fā)人員需要盡量避免這種跨場景跨進(jìn)程的游戲邏輯需求。

在分布式架構(gòu)實(shí)現(xiàn)中,目前商業(yè)上較成功的案例是BigWorld游戲服務(wù)框架,國內(nèi)外很多大型的游戲開發(fā)商都在使用。而在開源部分,目前還沒有較穩(wěn)定成熟的方案,我們團(tuán)隊(duì)采用Node.js正在開發(fā)的Pomelo游戲服務(wù)框架正在努力實(shí)現(xiàn)這一目標(biāo),現(xiàn)已進(jìn)入最后的文檔整理階段,預(yù)計(jì)將在十月份進(jìn)行開源與線上示例演示。

總結(jié)

<span style="display: inline !important; float: none; background-color: transparent; color: rgb(51,

相關(guān)文章:
【推薦】 一招搞定短信驗(yàn)證碼服務(wù)不穩(wěn)定

Node.js之網(wǎng)游服務(wù)器實(shí)踐的更多相關(guān)文章

  1. 十個(gè)書寫Node.js REST API的最佳實(shí)踐(上)

    收錄待用,修改轉(zhuǎn)載已取得騰訊云授權(quán) 原文:10 Best Practices for Writing Node.js REST APIs 我們會通過本文介紹下書寫Node.js REST API的最佳 ...

  2. 使用Node.js搭建靜態(tài)資源服務(wù)器

    對于Node.js新手,搭建一個(gè)靜態(tài)資源服務(wù)器是個(gè)不錯的鍛煉,從最簡單的返回文件或錯誤開始,漸進(jìn)增強(qiáng),還可以逐步加深對http的理解.那就開始吧,讓我們的雙手沾滿網(wǎng)絡(luò)請求! Note: 當(dāng)然在項(xiàng)目中如 ...

  3. 使用Node.js簡單創(chuàng)建一個(gè)服務(wù)器

    首先,我們要了解Node.js不是一種語言,它只是一個(gè)除了瀏覽器之外的,可以運(yùn)行js的環(huán)境. 其次,Node能做些什么 ? web服務(wù)器.  命令行工具.   網(wǎng)絡(luò)爬蟲. 桌面應(yīng)用程序開發(fā)等 3.接下 ...

  4. node.js作為“簡單HTTP服務(wù)器”

    場景 當(dāng)我學(xué)習(xí)一個(gè)JavaScript庫的時(shí)候,需要一個(gè)非常簡單的HTTP服務(wù)器把當(dāng)前工作路徑變?yōu)榫W(wǎng)站根目錄,由此來訪問網(wǎng)頁的靜態(tài)信息.現(xiàn)在,除了下邊的腳本server.js,假設(shè)你已經(jīng)擁有: 一個(gè)工 ...

  5. node.js和express創(chuàng)建服務(wù)器

    創(chuàng)建web服務(wù)器 一. 使用node.js創(chuàng)建服務(wù)器. 使用express創(chuàng)建http服務(wù). 監(jiān)控服務(wù)器的變化. 二. 初始化配置文件:npm init -y 使用typescript編寫,導(dǎo)入nod ...

  6. Node.js 薄荷網(wǎng)爬取

    Node.js:是一個(gè)基于前端的服務(wù)器,主要的特點(diǎn):單線程,異步I/O(對這個(gè)沒有了解,開發(fā)起來真的會踩很多坑),事件驅(qū)動 前言:本人主要是一個(gè)以使用.Net平臺下的語言,進(jìn)行開發(fā)的一個(gè)菜雞,之前面試 ...

  7. Node.js學(xué)習(xí)(11)----HTTP服務(wù)器與客戶端

    Node.js 標(biāo)準(zhǔn)庫提供了 http 模塊,其中封裝了一個(gè)高效的 HTTP 服務(wù)器和一個(gè)簡易的HTTP 客戶端.http.Server 是一個(gè)基于事件的 HTTP 服務(wù)器,它的核心由 Node.js ...

  8. node.js基礎(chǔ):HTTP服務(wù)器

    一個(gè)HTTP服務(wù)器響應(yīng) var http = require('http'); http.createServer(function(request,response){ response.end(' ...

  9. 使用Node.js搭建一個(gè)本地服務(wù)器

    let http = require('http'); //創(chuàng)建一個(gè)http let server = http.createServer((request,response)=>{ //創(chuàng)建一 ...

隨機(jī)推薦

  1. 正則表達(dá)式--js使用案例

    前言:在前端頁面使用中.遇到日期格式的驗(yàn)證.開始使用了一款表單控件驗(yàn)證.可是不兼容!!并且使用起來還受到非常大約束.所以就決定自己寫原生js. 為了完畢日期格式的驗(yàn)證.第一步,當(dāng)然是學(xué)會使用正則表達(dá)式 ...

  2. Android鎖屏或滅屏狀態(tài)下,高速按兩次音量下鍵實(shí)現(xiàn)抓拍功能(1.2Framework層使用startService形式實(shí)現(xiàn))

        如前一篇博文所分析.我們能夠使用廣播的形式在高速按下兩次音量下鍵的時(shí)候發(fā)出廣播,以方便client進(jìn)行捕捉. 既然有兩種方式能夠?qū)崿F(xiàn)該Issue那么哪種方式是首選呢?     我個(gè)人推薦使用啟 ...

  3. sql 導(dǎo)入數(shù)據(jù)庫 出現(xiàn)亂碼問題 解決辦法 設(shè)置 --default-character-set=utf8

    mysql -u root -p --default-character-set=utf8 use dbname source /root/newsdata.sql

  4. IOS UIPickView+sqlite 選擇中國全部城市案例

    1.案例簡單介紹 通過讀取文件.將中國全部城市寫入sqlite數(shù)據(jù)庫中,現(xiàn)通過UIPickView實(shí)現(xiàn)中國全部城市的選擇,效果圖例如以下所看到的 2.城市對象模型 中國全部城市數(shù)據(jù)請看http://b ...

  5. 關(guān)于 redux-saga 中 take 使用方法詳解

    本文介紹了關(guān)于redux-saga中take使用方法詳解,分享給大家,具體如下: 帶來一個(gè)自己研究好久的API使用方法. redux-saga中effect中take這個(gè)API使用方式,用的多的是ca ...

  6. 線程池實(shí)例:使用Executors和ThreadPoolExecutor

    線程池負(fù)責(zé)管理工作線程,包含一個(gè)等待執(zhí)行的任務(wù)隊(duì)列.線程池的任務(wù)隊(duì)列是一個(gè)Runnable集合,工作線程負(fù)責(zé)從任務(wù)隊(duì)列中取出并執(zhí)行Runnable對象. java.util.concurrent.ex ...

  7. Access 執(zhí)行查詢時(shí),拋出“標(biāo)準(zhǔn)表達(dá)式中數(shù)據(jù)類型不匹配”的錯誤

    Access根據(jù)時(shí)間查詢時(shí)應(yīng)在查詢條件前后加# SELECT COUNT(*) FROM [User] WHERE [CreateTime] > #{0}#

  8. 阿里云 ubuntu 14.04 模板上安裝 docker

    ubuntu 14.04 的內(nèi)核是 3.13 ,所以內(nèi)核不用升級. 安裝過程例如以下: # apt-get update # apt-get install apt-transport-https # ...

  9. php 0、null、empty和false之間的關(guān)系

    // 判斷 0 與 ''.null.empty.false 之間的關(guān)系 $a = 0; echo "0 與 ''. empty.null.false 之間的關(guān)系:"; if($a ...

  10. Redis HyperLogLog及應(yīng)用

    參考:http://www.runoob.com/redis/redis-hyperloglog.html Redis 在 2.8.9 之后的版本中,添加了 HyperLogLog 結(jié)構(gòu),用來做基數(shù)統(tǒng) ...

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    中文字幕亚洲精品乱码加勒比| 免费特黄欧美亚洲黄片| 美女极度色诱视频在线观看| 欧美一区二区日韩一区二区| 91日韩在线视频观看| 丁香七月啪啪激情综合| 亚洲精品福利入口在线| 国产偷拍盗摄一区二区| 亚洲国产精品久久综合网| 欧美二区视频在线观看| 中文字幕一区久久综合| 91欧美亚洲精品在线观看| 加勒比系列一区二区在线观看 | 人妻巨大乳一二三区麻豆| 久久精品久久久精品久久| 成在线人免费视频一区二区| 日本中文字幕在线精品| 亚洲香艳网久久五月婷婷| 精品人妻少妇二区三区| 国产高清一区二区白浆| 免费午夜福利不卡片在线 视频| 亚洲中文字幕高清视频在线观看| 熟女乱一区二区三区四区| 国产午夜福利不卡片在线观看| 婷婷色网视频在线播放| 丁香七月啪啪激情综合| 国内尹人香蕉综合在线| 熟女体下毛荫荫黑森林自拍| 好吊妞视频这里有精品| 青青久久亚洲婷婷中文网| 国产情侣激情在线对白| 日韩一区二区免费在线观看| 久久女同精品一区二区| 97人妻精品一区二区三区男同 | 91爽人人爽人人插人人爽| 狠狠做五月深爱婷婷综合| 欧美综合色婷婷欧美激情| 国产一区二区精品丝袜| 国产成人午夜福利片片| 国产欧美性成人精品午夜| 欧美国产日韩在线综合|