• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            OldJiang.com

            浩毛的博客

            OldJiang.com
            posts - 14, comments - 81, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

                在游戲服務(wù)器中,處理玩家登陸需要向數(shù)據(jù)庫(kù)查詢(xún)玩家的賬號(hào)和密碼,玩家上線和下線需要對(duì)玩家的角色數(shù)據(jù)從數(shù)據(jù)庫(kù)中讀取和保存。可以說(shuō),相對(duì)于游戲邏輯處理來(lái)說(shuō),數(shù)據(jù)庫(kù)操作是一種相對(duì)很慢的操作,即便你通過(guò)使用多個(gè)線程多個(gè)數(shù)據(jù)庫(kù)連接來(lái)提高數(shù)據(jù)庫(kù)操作的處理能力,但是,在高并發(fā)高負(fù)載的服務(wù)器應(yīng)用中,這樣仍然會(huì)是相當(dāng)?shù)呢?fù)載瓶頸。設(shè)想這樣一種設(shè)計(jì)方案,見(jiàn)下圖:

                在大量玩家登陸游戲服務(wù)器時(shí),由于有大量的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求,即便是有自己實(shí)現(xiàn)的CACHE機(jī)制,還是會(huì)導(dǎo)致服務(wù)器耗盡所有的邏輯線程資源,服務(wù)器的處理能力將降低成DBMS的處理能力。
                
                 為了不阻塞邏輯線程,可以采用異步數(shù)據(jù)庫(kù)訪問(wèn)的方式,即數(shù)據(jù)庫(kù)操作請(qǐng)求提交給專(zhuān)門(mén)的數(shù)據(jù)庫(kù)處理線程池,然后邏輯線程不再等待數(shù)據(jù)庫(kù)處理結(jié)果,繼續(xù)處理其他,不再阻塞在這里。
                 抽象的來(lái)看,對(duì)于一個(gè)需要持久化的游戲?qū)ο髞?lái)說(shuō),可以考慮它有2個(gè)方法,讀取和保存。那么我們抽象一個(gè)DBO接口:
               

            struct IDbo
            {
                
            virtual bool SaveToDB(DB*)=0;
                
            virtual bool LoadFromDB(DB*)=0;
            }
            ;
               
                 然后把設(shè)計(jì)方案改成下面這種:

             

                 改成數(shù)據(jù)庫(kù)異步處理后,在想想現(xiàn)在的游戲數(shù)據(jù)的保存機(jī)制應(yīng)該是怎樣改進(jìn)的,為了保障數(shù)據(jù)安全,我們希望不只是玩家下線的時(shí)候才會(huì)保存玩家數(shù)據(jù),而是希望每隔一段時(shí)間統(tǒng)一保存所有在線玩家的數(shù)據(jù),那么,可以考慮這樣的思路:假設(shè)我們有一個(gè)GAMEDB服務(wù)器,GAMEDB緩存了所有在線玩家的角色數(shù)據(jù),每到保存時(shí)間,GAMEDB就將所有在線玩家的數(shù)據(jù)(DBO)的副本都統(tǒng)一提交給DB線程池,讓它保存數(shù)據(jù),提交的過(guò)程很快,提交完后,GAMEDB的邏輯線程仍能繼續(xù)處理游戲服務(wù)器的更新和讀取CACHE的請(qǐng)求。為什么要保存副本呢,DB線程的執(zhí)行保存隊(duì)列的過(guò)程也許很耗時(shí),但是隊(duì)列中的數(shù)據(jù)都是GAMEDB提交DBO那個(gè)時(shí)刻的數(shù)據(jù),這樣就能保證玩家的游戲數(shù)據(jù)的完整性。
                  當(dāng)然,我這里提的這只是個(gè)思路,這里面還有很多細(xì)節(jié)沒(méi)有討論,例如如果DB線程池正在保存九點(diǎn)鐘時(shí)刻保存的數(shù)據(jù),到了十點(diǎn)鐘新的保存時(shí)刻時(shí),DB線程池還沒(méi)保存完九點(diǎn)鐘時(shí)刻的DBO副本隊(duì)列,這時(shí)應(yīng)該怎么處理;DBO對(duì)象的劃分粒度的問(wèn)題;DBO隊(duì)列的優(yōu)先級(jí)的問(wèn)題等等。

                 PS:這篇文章里的架構(gòu)其實(shí)就是一個(gè)GAMEDB服務(wù)器,里面的邏輯處理就是GAMEDB的邏輯處理。你可以把這篇文章理解成:一個(gè)GAMEDB服務(wù)器 的實(shí)現(xiàn)思路。。。

            Feedback

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-08-30 13:38 by Kevin Lynx
            基本上不會(huì)有人在游戲邏輯線程里放置IO操作的代碼吧,包括網(wǎng)絡(luò)和DB。對(duì)于玩家的重要操作有時(shí)候需要立即存儲(chǔ)。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-08-30 15:46 by vivian1683
            http://blog.sina.com.cn/s/articlelist_1791090757_10_1.html

            我是獵頭vivian..大量職位IT在招聘中.如果有考慮的朋友請(qǐng)發(fā)簡(jiǎn)歷到vivian1683@live.cn

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-08-30 20:56 by 球球
            問(wèn)題是DB不定受得了

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-08-31 09:37 by ZUHD
            說(shuō)的太粗糙,沒(méi)看到啥有用的觀點(diǎn)啊,再細(xì)化下呢

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-08-31 20:57 by vincent
            異步是一定的,包括db和io操作。而且在邏輯處理時(shí),并不能保證一定不處理db和io操作,總有些需要即時(shí)保存的東西

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-09-01 09:49 by RIC
            1 游戲的數(shù)據(jù)庫(kù)一般分 角色數(shù)據(jù)庫(kù)和賬號(hào)數(shù)據(jù)庫(kù)
            2 賬號(hào)數(shù)據(jù)庫(kù)一般與平臺(tái)綁定,通常情況下不會(huì)提供給你訪問(wèn)賬號(hào)數(shù)據(jù)庫(kù)的權(quán)限,而只會(huì)給你提供驗(yàn)證接口.
            3 角色數(shù)據(jù)庫(kù)也不是通常意義的直接從數(shù)據(jù)庫(kù)中讀,通常會(huì)有個(gè)緩沖,這個(gè)緩沖會(huì)動(dòng)態(tài)調(diào)整保存活躍度較高的玩家數(shù)據(jù)
            4 3中的緩沖通常由角色服務(wù)器來(lái)提供這樣的功能
            5 根據(jù)我的經(jīng)驗(yàn),邏輯相關(guān)網(wǎng)絡(luò)消息派發(fā)包很少有做多線程,無(wú)論是何種服務(wù)器,網(wǎng)絡(luò)底層可以這么做.
            7 其實(shí)數(shù)據(jù)庫(kù)服務(wù)器很簡(jiǎn)單,個(gè)人覺(jué)得不用這么麻煩的,看起來(lái)很高檔很合理的做法.
            8 個(gè)人意見(jiàn),僅供參考.
            (PS.我從事網(wǎng)絡(luò)游戲研發(fā)約5年,相對(duì)比較熟悉完成1個(gè)服務(wù)器構(gòu)架所需要的方方面面,另外,客戶(hù)端略懂)

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-09-05 11:58 by 浩毛
            @RIC
            我覺(jué)得可能我的說(shuō)法有些誤導(dǎo)大家,這篇文章里的架構(gòu)其實(shí)就是一個(gè)GAMEDB服務(wù)器,里面的邏輯處理就是GAMEDB的邏輯處理。你可以把這篇文章理解成:一個(gè)GAMEDB服務(wù)器 的實(shí)現(xiàn)思路。。。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-11-26 17:19 by 123
            這類(lèi)只讀的異步操作其實(shí)是很好處理的了,
            游戲里比較糾結(jié)的DB操作是:A、B兩個(gè)模塊同時(shí)發(fā)起對(duì)某個(gè)對(duì)象的保存或讀取,這樣很難保證新存的數(shù)據(jù)被舊的覆蓋或者讀取到得不是最新數(shù)據(jù)。
            如果序列化這些操作,又失去了異步的意義。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-12-28 23:55 by 浩毛
            @123
            我認(rèn)為很好解決,
            比如一個(gè)角色A

            在10:30:03的時(shí)候,角色A的內(nèi)存數(shù)據(jù)被復(fù)制出來(lái),提交給異步數(shù)據(jù)庫(kù)線程池,請(qǐng)求執(zhí)行數(shù)據(jù)庫(kù)寫(xiě)操作。

            10:30:04 角色A修改了內(nèi)存數(shù)據(jù)

            10:30:05 數(shù)據(jù)庫(kù)寫(xiě)操作完成。數(shù)據(jù)庫(kù)最新數(shù)據(jù)是0:30:03的時(shí)候的

            11:00 玩家下線,角色A的數(shù)據(jù)再被復(fù)制出來(lái),提交給異步數(shù)據(jù)庫(kù)線程池,請(qǐng)求執(zhí)行。。。


            。。。。提交的的數(shù)據(jù)庫(kù)操作的數(shù)據(jù),一定要復(fù)制新的一份。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2011-03-24 16:39 by J
            當(dāng)你的邏輯需要DB返回?cái)?shù)據(jù),你的異步DB操作怎么保證下面的邏輯操作繼續(xù)工作?沒(méi)有數(shù)據(jù)啊?

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2012-03-18 13:14 by QQ462624080隔夜壽局
            2011-03-24 16:39 by J
            當(dāng)你的邏輯需要DB返回?cái)?shù)據(jù),你的異步DB操作怎么保證下面的邏輯操作繼續(xù)工作?沒(méi)有數(shù)據(jù)啊?
            ------------------
            回復(fù)J:異步讀取數(shù)據(jù),函數(shù)邏輯不是連續(xù)的,要拆成兩個(gè)函數(shù)來(lái)完成,即是靠回調(diào)的。請(qǐng)求時(shí)會(huì)把一個(gè)id與sql請(qǐng)求發(fā)到db,并把id與函數(shù)指針關(guān)聯(lián)起來(lái)。db返回時(shí)會(huì)返回id與數(shù)據(jù),根據(jù)db返回的id找到之前關(guān)聯(lián)的相應(yīng)的函數(shù)指針,再調(diào)用之.
            這里所說(shuō)的函數(shù)指針真正說(shuō)法應(yīng)該是一個(gè)Functor,因?yàn)楸换卣{(diào)的函數(shù)中往往需要上一個(gè)函數(shù)中的參數(shù),Functor的作用就是把上一個(gè)函數(shù)的局部變量打包到回調(diào)函數(shù)中使用。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫(kù)異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2012-03-18 13:23 by QQ462624080隔夜壽司
            一個(gè)邏輯上的東西拆成2個(gè)函數(shù)來(lái)完成,確實(shí)代碼不美觀,不易閱讀。不過(guò)好在這部分邏輯較少。大部分?jǐn)?shù)據(jù)在玩家上線時(shí)已經(jīng)加載到GameServer內(nèi)存了。少數(shù)像玩家房屋之類(lèi)的just in time的數(shù)據(jù)就需要做這樣的回調(diào)。不知道誰(shuí)有更好的方法。歡迎交流
            OldJiang.com
            亚洲欧美成人综合久久久| 91亚洲国产成人久久精品网址| 久久综合久久鬼色| 思思久久99热只有频精品66| 亚洲综合日韩久久成人AV| 国内精品伊人久久久久| 99久久香蕉国产线看观香| 欧洲人妻丰满av无码久久不卡| 久久久久免费精品国产| 少妇熟女久久综合网色欲| 国产精品久久久久久影院| 久久热这里只有精品在线观看| 久久香蕉国产线看观看乱码| 中文字幕精品无码久久久久久3D日动漫 | 激情久久久久久久久久| 99久久国产精品免费一区二区| 99久久精品国产一区二区三区| 久久精品aⅴ无码中文字字幕重口| 久久国产视频99电影| 国内精品伊人久久久久AV影院| 一本大道久久东京热无码AV| 88久久精品无码一区二区毛片 | 亚洲色欲久久久综合网东京热| 办公室久久精品| 久久国产精品-国产精品| 免费久久人人爽人人爽av| 久久影视综合亚洲| 精品久久久久中文字| 亚洲乱亚洲乱淫久久| 国内精品久久久久影院日本| 亚洲精品乱码久久久久久按摩| 久久精品一区二区三区AV| 亚洲国产婷婷香蕉久久久久久| 日日狠狠久久偷偷色综合免费| 丰满少妇人妻久久久久久4| 国产一区二区精品久久| 青青草原1769久久免费播放| 免费观看成人久久网免费观看| 久久精品国产99国产精品澳门| 久久夜色tv网站| 久久久久久久综合日本|