來自谷歌的面試題: 死神殺人。
沒有計劃,隨便猜一個;
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能夠壓縮字節