Java遊戲服務器5

來自谷歌的面試題: 死神殺人。
    沒有計劃,隨便猜一個;
    A計劃: 50~75%的概率;
    99.5%的概率生存--》但是也可能全都死;


1)單線程方案
    單線程? 不會慢麼?
    解決慢,要比教會所有人跨線程寫邏輯簡單;
    架構師的工作是取捨和折中,不要炫技;
    項目框架越簡單,適用性就越廣;
    可以出錯,但是錯誤不要向下傳遞;
    
2)遊戲的單線程方案
    問題的提出: 
        A和B都打C,那麼可能引起死鎖。
        加鎖的話,並不是每個人加鎖時都頭腦清醒的。   









    由於都是在內存中操作的,單線程也很快,慢在IO。

3)單線程池
    讓寫業務的人不去考慮多線程。

4)LinkedBlockingQueue:
     還可以有拒絕策略, 直接告訴:服務器繁忙。

5)業務單線程架構模型:生產者消費者模式
    Netty那邊是IO線程,是要消耗點時間的。
    業務線程,則是在內存裏面,單線程也處理的過來。 都是線上驗證過得,開發也比較簡單。
    
6)遊戲服讀寫數據庫: CRUD ==》MyBatis --》從用戶登錄做起



7)不用管框架的運行機制,直接添加Handler即可。

8)遊戲服灰度發佈: 由於存儲的有狀態,做不到熱部署
    2個進程。

9)IO操作是在主線程上執行的: 讀寫數據庫時,造成線程阻塞。
    問題: 幾毫秒 幾十毫秒 甚至幾秒,會阻塞主線程。

    我們需要增加另外一個線程處理數據庫操作,那具體怎麼做呢?

10)形象類比
                        Netty

                 多個美女接待員(BossGroup)             

    我                                             上菜員(MainThreadProcessor)        多個廚師(AsyncOperationProcessor)

                 服務員(WorkerGroup) 


11)登陸就相當於異步操作了,那麼就寫一個異步操作相關的包。

12)打包: 默認resources文件夾下的會被打包到jar中,但是其它目錄的不會,需要手動配置纔行

13)一部分業務是:主線程。  
     一部分業務是在:異步線程中。
             因此是跨線程了,2個線程操作了相同的數據,造成錯誤。


     ==》數據庫的部分做異步就足夠了,其它部分,還要走正常的邏輯。

     線程綁定。

14)多線程處理IO時,
    2次操作如果被分配在2個線程中 "查數據 和 插入數據"。  ==》 如果是領獎操作,那麼就可能被刷的風險。

    加鎖: 又要加鎖了麼????

    無鎖: 
        根據操作的特徵值,把符合這個特徵值的操作,分配到一個線程中執行。
        比如: 即時執行了2次查詢,那麼由於在一個線程中,因此保證線程安全了。一個蘿蔔一個坑的感覺。

15)遊戲服務器開發的本質: 完成業務邏輯向多線程的映射。

16)引入MQ後: 讓數據庫的讀寫操作放到別的進程和機器上。 多線程生產者消費者的使用就是MQ的一個縮影。

17)pb能夠壓縮字節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章