為什么go語言適合開發網游服務器端
來源:程序員人生 發布時間:2015-07-01 08:18:22 閱讀次數:3151次
個人覺得golang10分合適進行網游
服務器端開發,寫下這篇文章總結1下。
從網游的角度看:
要成功的運營1款網游,很大程度上依賴于玩家自發構成的社區。只有玩家自發構成1個穩定的生態系統,游戲才能延續下去,避免鬼城的出現。而這就需要屢次大量導入用戶,在同時在線用戶量到達某個臨界點的時候,才有可能完成。因此,多人同時在線10分有必要。
再來看網游的常見玩法,除排行榜這類統計和數據匯總的功能外,基本沒有需要大量CPU時間的利用。之前的項目里,即時戰役產生的各種傷害計算對CPU的消耗也不大。玩家要完成1次操作,需要通過客戶端-
服務器端-客戶端這樣1個來回,為了取得高響應速度,滿足玩家體驗,
服務器真個處理也不能占用太多時間。所以,每次要求對應的CPU占用是比較小的。
網游的IO主要分兩個方面,1個是網絡IO,1個是磁盤IO。網絡IO方面,可以分成美術資源的IO和游戲邏輯指令的IO,這里主要分析游戲邏輯的IO。游戲邏輯的IO跟CPU占用的情況相似,每次要求的字節數很小,但由于多人同時在線,因此并發數相當高。另外,地圖信息的廣播也會帶來比較頻繁的網絡通訊。磁盤IO方面,主要是游戲數據的保存。采取不同的
數據庫,會有比較大的區分。之前的項目里,就經歷了從MySQL轉向MongoDB這類內存
數據庫的進程,磁盤IO不再是瓶頸。整體來講,還是用內存做1級緩沖,避免大量小數據塊讀寫的方案。
針對網游的這些特點,golang的語言特性10分合適開發游戲
服務器端。
首先,go語言提供goroutine機制作為原生的并發機制。每一個goroutine所需的內存很少,實際利用中可以啟動大量的goroutine對并發連接進行響應。goroutine與gevent中的greenlet很相像,遇到IO阻塞的時候,調度器就會自動切換到另外一個goroutine履行,保證CPU不會由于IO而產生等待。而goroutine與gevent相比,沒有了python底層的GIL限制,就不需要利用多進程來榨取多核機器的性能了。通過設置最大線程數,可以控制go所啟動的線程,每一個線程履行1個goroutine,讓CPU滿負載運行。
同時,go語言為goroutine提供了獨到的通訊機制channel。channel產生讀寫的時候,也會掛起當前操作channel的goroutine,是1種同步阻塞通訊。這樣既到達了通訊的目的,又實現同步,用CSP模型的觀點看,并發模型就是通過1組進程和進程間的事件觸發解決任務的。雖然說,主流的編程語言之間,只要是圖靈完備的,他們就都能實現相同的功能。但go語言提供的這類協程間通訊機制,10分優雅地揭露了協程通訊的本質,避免了以往鎖的顯式使用帶給程序員的心理負擔,確是1大優勢。進行網游開發的程序員,可以將游戲邏輯依照單線程阻塞式的寫,不需要額外斟酌線程調度的問題,和線程間數據依賴的問題。由于,線程間的channel通訊,已表達了線程間的數據依賴關系了,而go的調度器會給予妥善的處理。
另外,go語言提供的gc機制,和對指針的保護式使用,可以大大減輕程序員的開發壓力,提高開發效力。
展望未來,我期待go語言社區能夠提供更多的goroutine間的隔離機制。個人10分推重erlang社區的脆崩哲學,推動利用產生預期外行動時,盡早崩潰,再fork出新進程處理新的要求。對協程機制,需要由程序員保證履行的函數不會產生死循環,致使線程卡死。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈