兩年的項目開發一點小心得

        從11年8月份到現在,一直在參與開發一款網頁遊戲,我負責後端程序的開發,由java實現,基於mina框架。是現成的其他項目精剪後的框架給我們用的,我們只要在上面寫寫邏輯就差不多了。經歷了一年多的開發,去年10月份公司內開始測試,年底正式對外測試並且收費,年後到現在就處於調整優化推廣期了。2年的時間這麼長,總要寫點什麼,於是這就開始寫了。

       在之前,我都是在基於webhttp的框架上寫代碼,包括之前一年做的社交遊戲,現在要寫基於socket的框架寫代碼,所以還是有些不同的。http下,基本上就是請求處理,每個http請求都是同步處理的,處理完成一次性返回結果,無法主動推送內容給客戶端,只能是客戶端不停的輪訓。所以併發難上去,實時性達不到,性能也有點遜色,但是編碼簡單,上手容易。現在的公司早先一款頁遊,也是基於http的,但是遊戲需要大量實時的消息推送,因此又架了個實時服務器,客戶端socket長連接實時服務器,邏輯服務器把內容推送到實時服務器再由實時服務器廣播給flash客戶端,這樣就比較麻煩費勁。做交互性,實時性的遊戲,socket還是最合適的。

      在socket長連接下,客戶端和服務端建立一個長連接,服務端可以隨時把消息內容推送給客戶端,客戶端也可以隨時發送給服務端,不需要不停的建立斷開連接,節省了部分資源,最重要的,實時性得到很好的實現。缺點是,一臺服務器的總連接數是固定的,到達一定數目後就會有瓶頸,好在我們的遊戲要求一臺服不需要太多的人,不斷的開服是遊戲的盈利之道。

       mina是基於消息處理的,需要定義一個消息處理器,消息解碼和編碼器,我們的遊戲框架就基於此。消息處理器負責將收到的消息放入消息分發隊列,消息分發隊列根據消息類型投放消息,如果是用戶消息就放到用戶的消息隊列裏,如果是系統消息等則放到一個主消息處理隊列,它是按順序執行的,基本上除了用戶在場景裏,其他消息都由主消息隊列處理。消息解碼齊負責將收到的字節碼翻譯成一個java消息對象,然後給消息處理器。消息編碼器則負責把一個java消息對象翻譯成一個字節數組給mina發送給客戶端。

       所以我們的工作內容主要是,定義消息,編寫消息邏輯處理代碼,發送消息給客戶端,保存數據到數據庫。就這樣,我們編寫了遊戲的全部業務邏輯,我本人完成了明雷、裝備、倉庫系統,以及多人在線副本活動等模塊。對這個框架也是從不熟,到能用,到熟悉用的階段。

        上線後,出現過很多問題,比如升級時加經驗,偶爾會加爲負值,原因是併發導致的。一個boss被多個人打死,同樣是併發導致的。一艘船被很多人搶了,還是併發導致的。是怎麼解決的呢?信號量,消息隊列,synchronized。因爲我們的遊戲一個場景內消息是按順序處理的,不同場景則不再同一個線程,所以會產生併發情況。根據不同情況決定不同方法,比如打世界boss,我把所有人攻擊的消息放到一個隊列按順序處理,由於戰鬥過程是異步的,所以在前一場戰鬥結束後纔會進入下一場戰鬥,從而保證了順序,避免被多人打死的情況。比如搶船,定一個了一個唯一的信號量,先搶的人取得該信號量,則他戰鬥未結束前未釋放前,任何人都取不到該信號量從而無法搶,避免了被多人搶的情況。

        除了併發問題,我們在壓力測試的時候出現過線程池都卡死都處於等待狀態,發現登錄過程特別慢,於是開始優化,對於登錄流程,新註冊用戶減少部分sql查詢。但是效果不明顯,後來發現是因爲mysql爲定義索引導致的,開發時數據量上沒發現異常,測試時數據量多就會卡了。我們框架用的是hibernate3,無法自動生成索引,於是我們升級爲hibernate4,這個問題就解決了,登錄速度很快了。在這個過程,我們改動了線程池,把登錄的,戰鬥的,保存數據庫的,其他邏輯處理的線程池都分開了,以爲這會加快處理速度,其實這是在給自己挖坑!

        我們的線程池有一個公用的和一個根據角色id分配的線程池,公用的線程池只要有空閒線程,放進去的線程都會執行,而根據角色綁定的會根據角色id分配一個固定的線程池處理,這個固定的線程池是一個單線程線程池,所以保證同一個角色的異步線程能按照順序處理,避免要處理太多的併發情況。我們現在把根據角色分配的線程池複製了很多個,登錄啊,正常處理啊,如果這樣,會帶來併發問題,順序處理異步線程這個概念就失去了。於是我們發現會有部分玩家丟失數據,回檔。後來改爲就一個根據角色綁定的線程池,就好了。登錄登出一定要按照順序進行,登錄或者登出過程中(會產生異步線程讀取和保存數據),務必不能讓玩家再次登錄,否則就會產生回檔可能。

       還有其他問題,比如數據庫那會兒第一天批量開服出現數據庫非常緩慢情況,後來運維同學說硬盤被不知情人士拔了導致數據庫異常,那會兒着實讓我緊張糾結了一回,查了很久異常,一直以爲是不是代碼這錯了。後來數據庫他們經過優化後,現在很穩定了。現在遊戲很穩定運行了,玩家論壇從一開始罵技術爛到現在開始罵策劃把遊戲搞傻逼了。

       今年春節回來,確切說從去年10月份開始,就經常熬夜加班了,經常很晚回家了,因爲每週都要發版本,有時候一週發2個,全組人員都很緊張疲憊,我也受不了每天一個半小時的上班坐車時間,外加一個班小時的下班坐車時間,加班晚了都沒車回去,只能打車,早晨還起不來,起來也是特別疲憊,一天沒精神,連續加班那幾天,人都感覺快散了。不得已,就搬近點了,以方便隨時加班。從鄉村到市區,房租漲了3倍,工資分文未漲,我這到底是在操心啥啊!去年這個月份漲工資了,今年沒漲,問老大說年中會漲,但是不知道時間。那也只能等了。

        感覺這個遊戲項目應該是步入穩定甚至成熟期了,後面的功能也就是純粹的功能了。可能很快又有會新項目要做,挖坑埋坑可能要繼續重來了,開發一款遊戲真的好累,我們團隊算是比較穩定的,從立項到現在完成,離職人員極少,核心人員全程參與未離開,這也是項目進展得到保證的一個原因吧。我以前公司的一個項目做了很久人來的來走的走,最後雖然上線了,也很快就下線了。所以穩定的開發團隊還是非常有必要的,這也是建立在老闆肯花錢的基礎上。呵呵,這個大家都懂!

 

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