• <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>

            Sheppard Y

            keep thinking keep coding.

            集群實(shí)現(xiàn)細(xì)節(jié)(2)-玩家在線狀態(tài)續(xù)

            2016-07-11 日更新 
            此篇博客已經(jīng)遷移到新博客,并做行文檢查和優(yōu)化排版:
            http://blog.clawz.me/2013/10/19/13-game-cluster-design-detail-2/

             


             

            一、玩家離線

                由于離線的狀況多,常見(jiàn)的玩家自己拿自己的賬號(hào)的離線,也有自己的賬號(hào)在多個(gè)設(shè)備來(lái)擠掉線,還有就是被非法的人使用時(shí)的擠掉線。這里應(yīng)該將玩家理解為一個(gè)賬號(hào),下邊盡量用賬號(hào)來(lái)表述。

            (一)網(wǎng)絡(luò)斷開(kāi)或者主動(dòng)離開(kāi)游戲

                這時(shí)玩家所在的服務(wù)器在玩家net.close時(shí)加入向通信redis匯報(bào)的邏輯,即通信redis里刪除這個(gè)玩家的在線紀(jì)錄。

             

            (二)同服重復(fù)登陸時(shí)的kick

                首先肯定要踢掉之前登陸的鏈接。因?yàn)橥r(shí)新舊鏈接都在這個(gè)服務(wù)器上,邏輯上簡(jiǎn)單,允許新鏈接的登陸比較好處理,但是后邊有其他考慮。

             

            (三)異服登陸時(shí)的kick

                首先也是踢掉之前的登陸。需要在之前登陸到的服務(wù)器將該賬號(hào)的鏈接斷開(kāi)并整理數(shù)據(jù)存儲(chǔ)之后,才能允許在新的服務(wù)器登陸。

                舊服務(wù)器清理完該玩家后,向通信redis報(bào)告刪除該賬號(hào)的在線狀態(tài)。新服務(wù)器需要知道玩家已經(jīng)在舊服被kick完了才可以讓玩家登陸。剛才同服時(shí)提到的允許新鏈接立刻登陸的問(wèn)題,這里就變的比較不可控了。美好的過(guò)程是,新鏈接接入后掛起在新服,等異服踢完后,繼續(xù)做新鏈接的登陸操作。但是這需要新舊服之間的同步邏輯,需要將新服玩家做個(gè)狀態(tài)機(jī)為維護(hù)這種掛起或繼續(xù)登陸狀態(tài)。另外還要考慮這個(gè)期間玩家又在另一個(gè)服登陸。要考慮的東西很多……

                還有一種有問(wèn)題的處理方式,即新服只是向老服發(fā)送踢人指令,新服自己卻馬上進(jìn)入新鏈接的登陸操作。這樣的問(wèn)題是,即使業(yè)務(wù)邏輯簡(jiǎn)單到不會(huì)發(fā)生數(shù)據(jù)不同步問(wèn)題,但登陸操作不會(huì)一定成功。新服登陸完向通信redis報(bào)告玩家在線,舊服踢完要向通信redis報(bào)告玩家離線。這兩個(gè)操作異步時(shí),如果舊服的離線報(bào)告在后,通信redis上就會(huì)錯(cuò)誤的記錄賬號(hào)當(dāng)前不在線……

             

            (四)總結(jié)

                最終重復(fù)登陸問(wèn)題簡(jiǎn)單處理方法:賬號(hào)登陸時(shí),只要檢測(cè)到該賬號(hào)同服或異服已登陸,先將舊鏈接踢掉,再將新鏈接斷開(kāi)。就給玩家一個(gè)提示“賬號(hào)已登錄,請(qǐng)稍后重試”,讓玩家自己來(lái)多操作幾次,直到舊鏈接被踢完。

                

            二、同一賬號(hào)的同瞬間多起登陸事件

                ​上邊重復(fù)登陸的檢查還有一種情況不能防止,就是瞬間的多個(gè)客戶端用同一賬號(hào)登陸。同服時(shí)由于nodejs的異步,異服時(shí)由于天然異步,檢查該賬號(hào)是否已登陸與將當(dāng)前鏈接成功登陸并向通信redis報(bào)告這些操作不具原子性。

                ​所以在最后向通信redis寫(xiě)入上線狀態(tài)時(shí)再次判斷是否已登陸(即判斷是否被瞬時(shí)并發(fā)的另一個(gè)客戶端的登陸給標(biāo)記為已上線了)。redis里用hsetnx代替hset,前者在數(shù)據(jù)已經(jīng)被設(shè)置時(shí)操作失敗。

            PS:

                剛接觸不久或者本身邏輯就復(fù)雜的東西(例如分布式)很多思考的結(jié)果不及時(shí)記錄的話,后邊容易忘記當(dāng)初的理由,導(dǎo)致需要冗余的重復(fù)思考。所以現(xiàn)在博客寫(xiě)瑣碎些,記載些細(xì)節(jié)的思考。

             

             

            posted on 2013-10-19 09:41 Sheppard Y 閱讀(957) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)架構(gòu)

            <2014年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(1)

            隨筆分類(77)

            隨筆檔案(58)

            me

            基友

            同行

            業(yè)界前輩

            最新隨筆

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            国产激情久久久久影院老熟女免费| 亚洲а∨天堂久久精品| 久久国产高潮流白浆免费观看| 亚洲精品乱码久久久久久中文字幕 | 好久久免费视频高清| 91亚洲国产成人久久精品| 伊人色综合久久| 久久人人爽人人爽人人av东京热 | 一本大道加勒比久久综合| 久久综合日本熟妇| 国内精品九九久久久精品| 久久久久久久久久免免费精品 | 亚洲乱亚洲乱淫久久| 亚洲精品国精品久久99热| 91精品国产9l久久久久| 欧美日韩精品久久免费| 成人亚洲欧美久久久久| 久久精品亚洲AV久久久无码| 久久国产成人亚洲精品影院| 久久精品人人槡人妻人人玩AV| 少妇久久久久久被弄到高潮| 亚洲伊人久久大香线蕉苏妲己| 国产精品无码久久久久久| 久久久免费观成人影院| 久久国产精品-国产精品| 亚洲va国产va天堂va久久| 久久综合久久美利坚合众国| 久久精品亚洲乱码伦伦中文| 久久精品国产免费| 国产精品99久久免费观看| 久久综合噜噜激激的五月天| 久久久久久综合网天天| 久久国产亚洲精品| 亚洲午夜精品久久久久久app| 久久丝袜精品中文字幕| 久久精品国产亚洲一区二区三区| 亚洲综合精品香蕉久久网97| 国产91久久精品一区二区| 久久久综合九色合综国产| 亚洲午夜久久影院| 久久精品国产精品亜洲毛片|