400-638-8808
|
微信公眾號




穩(wěn)定可靠 永不間斷

海外收發(fā) 暢通無阻

協(xié)同辦公 資源管理

超大郵件 超級功能

智能反垃圾郵件技術
易管理 免維護

在游戲服務器中,線程的管理是重中之重,因為線程數量不能太多,所以為了提高游戲服務器并發(fā)性,就需要在線程處理業(yè)務的速度要快,不能長時間卡住線程,比如,不能有網絡io,磁盤IO等耗時的操作。所以我們會把有限的線程數進配按需分配。線程的主要分配方式如下:
1,與客戶端的IO線程
負責接收客戶端消息,和向客戶端發(fā)送消息。
2,處理玩家業(yè)務的邏輯線程
負責業(yè)務邏輯的處理與計算。
3,處理rpc或數據庫同步的網絡線程。
負責不同服務之間的通信
4,處理日志的磁盤IO 線程

相應的線程分別做自己該做的時間。但是這時候問題來了,既然按用途分配了這些線程,那不可免費的就會出現不同線程之間的數據交互了。舉個例子來說,比如玩家登陸和排隊,假如說一個區(qū)一臺物理機,處理與客戶端的IO線程占1個,業(yè)務邏輯線程16個,請求數據庫的線程3個。其它的先忽略不算。這個時候,服務器收到客戶端登陸的請求,業(yè)務線程收到這個請求,第一件事情是去數據庫查用戶的信息,因為業(yè)務邏輯線程是多個用戶之間共用的,所以你不能在這里等待數據庫請求的返回,要不然會卡別的業(yè)務邏輯處理。最好的做法就是,把這個請求封裝成一個事件,發(fā)送到數據庫同步線程中去處理這個事。等待數據庫線程處理完了,再把結果告訴業(yè)務邏輯線程,然后再處理業(yè)務,這個時候處理的數據都在內存中了,所以速度非?欤幚硗曛笤俜祷乜蛻舳恕
有人說,那這樣還不是卡登陸嗎?是的,必卡登陸,因為處理數據庫的線程就那么3個。對于mysql的查詢性能測試如下:

我們3個線程按1500個計算,那么也只有登陸并發(fā)達到1500的時候,才會覺得服務慢一些,(實際情況可能會再底一些),如果并發(fā)能達到這么高,說明游戲很火了,可以等待數錢了。如果再多的人,我們就可以使用排隊的功能的。可以查詢到數據庫線程中正在等待執(zhí)行任務的數量,如果達到某個值,就可以在業(yè)務服務中給客戶端返回正在排隊的,讓客戶端過一會再來請求即可。
回到正題,那么游戲服務器線程之間該如何傳遞數據呢,可能每個人的做法不一樣,這里只列舉中一個,希望給大家給帶來些參考,就當是交流學習了。如果你有更好的方法,也希望您評論分享。
在Java中,多線程之間交互數據,即A線程給B線程一個請求事件,A線程還要獲取B線程的執(zhí)行結果,比如登陸,請數據庫線程去查庫,查完之后告訴邏輯線程。Java提供了一個Future/Callable的機制,詳細大家可以自動百度它們的用法,但是它們有一個缺點,就是A線程在獲取結果時(調用future.get())的時候是同步的,如果B線程沒有執(zhí)行完,還是會卡A線程。這顯示不是我們想要的。對于這一點,我們偉大的異步框架,netty的作者給出了一個解決方法,那就是Future / promise模式。這里對它的源碼暫不做分皙了,有時間另寫文章說明吧,有興趣的同學可以自己查看。這里只說一下它的用法。
此代碼只是模擬,真實應用中還需要自己設計,首先是數據庫查詢的管理類:

然后是業(yè)務管理類:

通過這個例子,其它關于多線程交互數據的功能實現,大家就可以舉一返回三了。
天下數據為網絡游戲營運公司提供了高性能、高可用、可伸縮性、高性價比的IDC數據中心解決方案!詳詢在線客服!
上一篇 :韓國服務器租用有什么作用?
天下數據手機站 關于天下數據 聯系我們 誠聘英才 付款方式 幫助中心 網站備案 解決方案 域名注冊 網站地圖
天下數據18年專注海外香港服務器、美國服務器、海外云主機、海外vps主機租用托管以及服務器解決方案-做天下最好的IDC服務商
《中華人民共和國增值電信業(yè)務經營許可證》 ISP證:粵ICP備07026347號
朗信天下發(fā)展有限公司(控股)深圳市朗玥科技有限公司(運營)聯合版權
深圳總部:中國.深圳市南山區(qū)深圳國際創(chuàng)新谷6棟B座10層 香港總部:香港上環(huán)蘇杭街49-51號建安商業(yè)大廈7樓
7×24小時服務熱線:4006388808香港服務電話:+852 67031102
本網站的域名注冊業(yè)務代理北京新網數碼信息技術有限公司的產品