⑴ 端游,手游服務端常用的架構是什麼樣的
端游、手游服務端常用的架構是什麼樣的?
類型1:卡牌、跑酷等弱交互服務端卡牌跑酷類
因為交互弱,玩家和玩家之間不需要實時面對面PK,打一下對方的離線數據,計算下排行榜,買賣下道具即可,所以實現往往使用簡單的 HTTP伺服器:
登錄時可以使用非對稱加密(RSA, DH),伺服器根據客戶端uid,當前時間戳還有服務端私鑰,計算哈希得到的加密 key 並發送給客戶端。之後雙方都用 HTTP通信,並用那個key進行RC4加密。客戶端收到key和時間戳後保存在內存,用於之後通信,服務端不需要保存 key,因為每次都可以根據客戶端傳上來的 uid 和 時間戳 以及服務端自己的私鑰計算得到。用模仿 TLS的行為,來保證多次 HTTP請求間的客戶端身份,並通過時間戳保證同一人兩次登錄密鑰不同。
每局開始時,訪問一下,請求一下關卡數據,玩完了又提交一下,驗算一下是否合法,獲得什麼獎勵,資料庫用單台 MySQL或者 MongoDB即可,後端的 Redis做緩存(可選)。如果要實現通知,那麼讓客戶端定時15秒輪詢一下伺服器,如果有消息就取下來,如果沒消息可以逐步放長輪詢時間,比如30秒;如果有消息,就縮短輪詢時間到10秒,5秒,即便兩人聊天,延遲也能自適應。
此類伺服器用來實現一款三國類策略或者卡牌及酷跑的游戲已經綽綽有餘,這類游戲因為邏輯簡單,玩家之間交互不強,使用 HTTP來開發的話,開發速度快,調試只需要一個瀏覽器就可以把邏輯調試清楚了。
類型2:第一代游戲伺服器 1978
1978年,英國著名的財經學校University of Essex的學生 Roy Trubshaw編寫了世界上第一個MUD程序《MUD1》,在University of Essex於1980年接入 ARPANET之後加入了不少外部的玩家,甚至包括國外的玩家。《MUD1》程序的源代碼在 ARPANET共享之後出現了眾多的改編版本,至此MUD才在全世界廣泛流行起來。不斷完善的 MUD1的基礎上產生了開源的 MudOS(1991),成為眾多網游的鼻祖:
MUDOS採用 C語言開發,因為玩家和玩家之間有比較強的交互(聊天,交易,PK),MUDOS使用單線程無阻塞套接字來服務所有玩家,所有玩家的請求都發到同一個線程去處理,主線程每隔1秒鍾更新一次所有對象(網路收發,更新對象狀態機,處理超時,刷新地圖,刷新NPC)。
游戲世界採用房間的形式組織起來,每個房間有東南西北四個方向可以移動到下一個房間,由於歐美最早的網游都是地牢迷宮形式的,因此場景的基本單位被成為 「房間」。MUDOS使用一門稱為LPC的腳本語言來描述整個世界(包括房間拓撲,配置,NPC,以及各種劇情)。游戲裡面的高級玩家(巫師),可以不斷的通過修改腳本來為游戲添加房間以及增加劇情。早年 MUD1上線時只有17個房間,Roy Trubshaw畢業以後交給他的師弟 Richard Battle,在 Richard Battle手上,不斷的添加各種玩法到一百多個房間,終於讓 MUD發揚光大。
用戶使用 Telnet之類的客戶端用 Tcp協議連接到 MUDOS上,使用純文字進行游戲,每條指令用回車進行分割。比如 1995年國內第一款 MUD游戲《俠客行》,你敲入:」go east」,游戲就會提示你:「後花園 - 這里是歸雲庄的後花園,種滿了花草,幾個庄丁正在澆花。此地乃是含羞草生長之地。這里唯一的出口是 north。這里有:花待 阿牧(A mu),還有二位庄丁(Zhuang Ding)」,然後你繼續用文字操作,查看阿牧的信息:「look a mu」,系統提示:「花待 阿牧(A mu)他是陸乘風的弟子,受命在此看管含羞草。他看起來三十多歲,生得眉清目秀,端正大方,一表人才。他的武藝看上去【不是很高】,出手似乎【極輕】」。然後你可以選擇擊敗他獲得含羞草,但是你吃了含羞草卻又可能會中毒死亡。在早期網上資源貧乏的時候,這樣的游戲有很強的代入感。
用戶數據保存在文件中,每個用戶登錄時,從文本文件里把用戶的數據全部載入進來,操作全部在內存裡面進行,無需馬上刷回磁碟。用戶退出了,或者每隔5分鍾檢查到數據改動了,都會保存會磁碟。這樣的系統在當時每台伺服器承載個4000人同時游戲,不是特別大的問題。從1991年的 MUDOS發布後,全球各地都在為他改進,擴充,退出新版本,隨著 Windows圖形機能的增強。1997游戲《UO》在 MUDOS的基礎上為角色增加的x,y坐標,為每個房間增加了地圖,並且為每個角色增加了動畫,形成了第一代的圖形網路游戲。
因為游戲內容基本可以通過 LPC腳本進行定製,所以MUDOS也成為名副其實的第一款服務端引擎,引擎一次性開發出來,然後製作不同游戲內容。後續國內的《萬王之王》等游戲,很多都是跟《UO》一樣,直接在 MUDOS上進行二次開發,加入房間的地圖還有角色的坐標等要素,該架構一直為國內的第一代 MMORPG提供了穩固的支持,直到 2003年,還有游戲基於 MUDOS開發。雖然後面圖形化增加了很多東西,但是這些MMORPG後端的本質還是 MUDOS。隨著游戲內容的越來越復雜,架構變得越來越吃不消了,各種負載問題慢慢浮上水面,於是有了我們的第二代游戲伺服器。
類型3:第二代游戲伺服器 2003
2000年後,網游已經脫離最初的文字MUD,進入全面圖形化年代。最先承受不住的其實是很多小文件,用戶上下線,頻繁的讀取寫入用戶數據,導致負載越來越大。隨著在線人數的增加和游戲數據的增加,伺服器變得不抗重負。同時早期 EXT磁碟分區比較脆弱,稍微停電,容易發生大面積數據丟失。因此第一步就是拆分文件存儲到資料庫去。
此時游戲服務端已經脫離陳舊的 MUDOS體系,各個公司在參考 MUDOS結構的情況下,開始自己用 C在重新開發自己的游戲服務端。並且腳本也拋棄了 LPC,採用擴展性更好的 Python或者 Lua來代替。由於主邏輯使用單線程模型,隨著游戲內容的增加,傳統單伺服器的結構進一步成為瓶頸。於是有人開始拆分游戲世界,變為下面的模型:
游戲伺服器壓力拆分後得意緩解,但是兩台游戲伺服器同時訪問資料庫,大量重復訪問,大量數據交換,使得資料庫成為下一個瓶頸。於是形成了資料庫前端代理(DB Proxy),游戲伺服器不直接訪問資料庫而是訪問代理,再有代理訪問資料庫,同時提供內存級別的cache。早年 MySQL4之前沒有提供存儲過程,這個前端代理一般和 MySQL跑在同一台上,它轉化游戲伺服器發過來的高級數據操作指令,拆分成具體的資料庫操作,一定程度上代替了存儲過程:
但是這樣的結構並沒有持續太長時間,因為玩家切換場景經常要切換連接,中間的狀態容易錯亂。而且游戲伺服器多了以後,相互之間數據交互又會變得比較麻煩,於是人們拆分了網路功能,獨立出一個網關服務 Gate(有的地方叫 Session,有的地方叫 LinkSvr之類的,名字不同而已):
把網路功能單獨提取出來,讓用戶統一去連接一個網關伺服器,再有網關伺服器轉發數據到後端游戲伺服器。而游戲伺服器之間數據交換也統一連接到網管進行交換。這樣類型的伺服器基本能穩定的為玩家提供游戲服務,一台網關服務1-2萬人,後面的游戲伺服器每台服務5k-1w,依游戲類型和復雜度不同而已,圖中隱藏了很多不重要的伺服器,如登錄和管理。這是目前應用最廣的一個模型,到今天任然很多新項目會才用這樣的結構來搭建。
人都是有慣性的,按照先前的經驗,似乎把 MUDOS拆分的越開性能越好。於是大家繼續想,網關可以拆分呀,基礎服務如聊天交易,可以拆分呀,還可以提供web介面,資料庫可以拆分呀,於是有了下面的模型:
這樣的模型好用么?確實有成功游戲使用類似這樣的架構,並且發揮了它的性能優勢,比如一些大型 MMORPG。但是有兩個挑戰:每增加一級伺服器,狀態機復雜度可能會翻倍,導致研發和找bug的成本上升;並且對開發組挑戰比較大,一旦項目時間吃緊,開發人員經驗不足,很容易弄掛。
比如我見過某上海一線游戲公司的一個 RPG上來就要上這樣的架構,我看了下他們團隊成員的經驗,問了下他們的上線日期,勸他們用前面稍微簡單一點的模型。人家自信得很,認為有成功項目是這么做的,他們也要這么做,自己很想實現一套。於是他們義無反顧的開始編碼,項目做了一年多,然後,就沒有然後了。
現今在游戲成功率不高的情況下,一開始上一套比較復雜的架構需要考慮投資回報率,比如你的游戲上線半年內 PCU會去到多少?如果一個 APRG游戲,每組伺服器5千人都到不了的話,那麼選擇一套更為貼近實際情況的結構更為經濟。即使後面你的項目真的超過5千人朝著1萬人目標奔的話,相信那個時候你的項目已經掙大錢了 ,你數著錢加著班去逐步迭代,一次次拆分它,相信心裡也是樂開花的。
上面這些類型基本都是從拆分 MUDOS開始,將 MUDOS中的各個部件從單機一步步拆成分布式。雖然今天任然很多新項目在用上面某一種類似的結構,或者自己又做了其他熱點模塊的拆分。因為他們本質上都是對 MUDOS的分解,故將他們歸納為第二代游戲伺服器。
類型4:第三代游戲伺服器
2007從魔獸世界開始無縫世界地圖已經深入人心,比較以往游戲玩家走個幾步還需要切換場景,每次切換就要等待 LOADING個幾十秒是一件十分破壞游戲體驗的事情。於是對於 2005年以後的大型 MMORPG來說,無縫地圖已成為一個標准配置。比較以往按照地圖來切割游戲而言,無縫世界並不存在一塊地圖上面的人有且只由一台伺服器處理了:
每台 Node伺服器用來管理一塊地圖區域,由 NodeMaster(NM)來為他們提供總體管理。更高層次的 World則提供大陸級別的管理服務。這里省略若干細節伺服器,比如傳統資料庫前端,登錄伺服器,日誌和監控等,統統用 ADMIN概括。在這樣的結構下,玩家從一塊區域走向另外一塊區域需要簡單處理一下:
玩家1完全由節點A控制,玩家3完全由節點B控制。而處在兩個節點邊緣的2號玩家,則同時由A和B提供服務。玩家2從A移動到B的過程中,會同時向A請求左邊的情況,並向B請求右邊的情況。但是此時玩家2還是屬於A管理。直到玩家2徹底離開AB邊界很遠,才徹底交由B管理。按照這樣的邏輯將世界地圖分割為一塊一塊的區域,交由不同的 Node去管理。
對於一個 Node所負責的區域,地理上沒必要連接在一起,比如大陸的四周邊緣部分和高山部分的區塊人比較少,可以統一交給一個Node去管理,而這些區塊在地理上並沒有聯系在一起的必要性。一個 Node到底管理哪些區塊,可以根據游戲實時運行的負載情況,定時維護的時候進行更改 NodeMaster 上面的配置。於是碰到第一個問題是很多 Node伺服器需要和玩家進行通信,需要問管理伺服器特定UID為多少的玩家到底在哪台 Gate上,以前按場景切割的伺服器這個問題不大,問了一次以後就可以緩存起來了,但是現在伺服器種類增加不少,玩家又會飄來飄去,按UID查找玩家比較麻煩;另外一方面 GATE需要動態根據坐標計算和哪些 Node通信,導致邏輯越來越厚,於是把:「用戶對象」從負責連接管理的 GATE中切割出來勢在必行於是有了下面的模型:
網關伺服器再次退回到精簡的網路轉發功能,而用戶邏輯則由按照 UID劃分的 OBJ伺服器來承擔,GATE是按照網路接入時的負載來分布,而 OBJ則是按照資源的編號(UID)來分布,這樣和一個用戶通信直接根據 UID計算出 OBJ伺服器編號發送數據即可。而新獨立出來的 OBJ則提供了更多高層次的服務:
對象移動:管理具體玩家在不同的 Node所管轄的區域之間的移動,並同需要的 Node進行溝通。
數據廣播:Node可以給每個用戶設置若干 TAG,然後通知 Object Master 按照TAG廣播。
對象消息:通用消息推送,給某個用戶發送數據,直接告訴 OBJ,不需要直接和 GATE打交道。
好友聊天:角色之間聊天直接走 OBJ/OBJ MASTER。整個伺服器主體分為三層以後,NODE專注場景,OBJ專注玩家對象,
GATE專注網路。這樣的模型在無縫場景伺服器中得到廣泛的應用。但是隨著時間的推移,負載問題也越來越明顯,做個活動,遠來不活躍的區域變得十分活躍,靠每周維護來調整還是比較笨重的,於是有了動態負載均衡。動態負載均衡有兩種方法,第一種是按照負載,由 Node Master 定時動態移動修改一下各個 Node的邊界,而不同的玩家對象按照先前的方法從一台 Node上遷移到另外一台 Node上:
圖11 動態負載均衡
Node Master定時查找地圖上的熱點區域,計算新的場景切割方式,然後告訴其他伺服器開始調整,具體處理方式還是和上面對象跨越邊界移動的方法一樣。但是上面這種方式實現相對復雜一些,於是人們設計出了更為簡單直接的一種新方法:
圖12 基於網格的動態負載均衡
於網格的動態負載均衡還是將地圖按照標准尺寸均勻切割成靜態的網格,每個格子由一個具體的Node負責,但是根據負載情況,能夠實時的遷移到其他 Node上。在遷移分為三個階段:准備,切換,完成。三個狀態由Node Master負責維護。准備階段新的 Node開始同步老 Node上面該網格的數據,完成後告訴NM;NM確認OK後同時通知新舊 Node完成切換。完成切換後,如果 Obj伺服器還在和老的 Node進行通信,老的 Node將會對它進行糾正,得到糾正的 OBJ將修正自己的狀態,和新的 Node進行通信。
很多無縫動態負載均衡的服務端宣稱自己支持無限的人數,但不意味著 MMORPG游戲的人數上限真的可以無限擴充,因為這樣的體系會受制於網路帶寬和客戶端性能。帶寬決定了同一個區域最大廣播上限,而客戶端性能決定了同一個屏幕到底可以繪制多少個角色。
從無縫地圖引入了分布式對象模型開始,已經完全脫離 MUDOS體系,成為一種新的服務端模型。又由於動態負載均衡的引入,讓無縫伺服器如虎添翼,容納著超過上一代游戲伺服器數倍的人數上限,並提供了更好的游戲體驗,我們稱其為第三代游戲服務端架構。網游以大型多人角色扮演為開端,RPG網游在相當長的時間里一度占據90%以上,使得基於 MMORPG的服務端架構得到了蓬勃的發展,然而隨著玩家對RPG的疲憊,各種非MMORPG游戲如雨後春筍般的出現在人們眼前,受到市場的歡迎。
類型5:戰網游戲伺服器
經典戰網服務端和 RPG游戲有兩個區別:RPG是分區分服的,北京區的用戶和廣州區的用戶老死不相往來。而戰網,雖然每局游戲一般都是 8人以內,但全國只有一套伺服器,所有的玩家都可以在一起游戲,而玩家和玩家之使用 P2P的方式連接在一起,組成一局游戲:
玩家通過 Match Making 伺服器使用:創建、加入、自動匹配、邀請 等方式組成一局游戲。伺服器會選擇一個人做 Host,其他人 P2P連接到做主的玩家上來。STUN是幫助玩家之間建立 P2P的牽引伺服器,而由於 P2P聯通情況大概只有 75%,實在聯不通的玩家會通過 Forward進行轉發。
大量的連接對戰,體育競技游戲採用類似的結構。P2P有網狀模型(所有玩家互相連接),和星狀模型(所有玩家連接一個主玩家)。復雜的游戲狀態在網狀模型下難以形成一致,因此星狀P2P模型經受住了歷史的考驗。除去游戲數據,支持語音的戰網系統也會將所有人的語音數據發送到做主的那個玩家機器上,通過混音去重再編碼的方式返回給所有用戶。
戰網類游戲,以競技、體育、動作等類型的游戲為主,較慢節奏的 RPG(包括ARPG)有本質上的區別,而激烈的游戲過程必然帶來到較 RPG復雜的多的同步策略,這樣的同步機制往往帶來的是很多游戲結果由客戶端直接計算得出,那在到處都是破解的今天,如何保證游戲結果的公正呢?
主要方法就是投票法,所有客戶端都會獨立計算,然後傳遞給伺服器。如果結果相同就更新記錄,如果結果不一致,會採取類似投票的方式確定最終結果。同時記錄本劇游戲的所有輸入,在可能的情況下,找另外閑散的游戲客戶端驗算整局游戲是否為該結果。並且記錄經常有作弊嫌疑的用戶,供運營人員封號時參考。
類型7:休閑游戲伺服器
休閑游戲同戰網伺服器類似,都是全區架構,不同的是有房間伺服器,還有具體的游戲伺服器,游戲主體不再以玩家 P2P進行,而是連接到專門的游戲伺服器處理:
和戰網一樣的全區架構,用戶數據不能象分區的 RPG那樣一次性load到內存,然後在內存裡面直接修改。全區架構下,為了應對一個用戶同時玩幾個游戲,用戶數據需要區分基本數據和不同的游戲數據,而游戲數據又需要區分積分數據、和文檔數據。勝平負之類的積分可以直接提交增量修改,而更為普遍的文檔類數據則需要提供讀寫令牌,寫令牌只有一塊,讀令牌有很多塊。同帳號同一個游戲同時在兩台電腦上玩時,最先開始的那個游戲獲得寫令牌,可以操作任意的用戶數據。而後開始的那個游戲除了可以提交勝平負積分的增量改變外,對用戶數據採用只讀的方式,保證游戲能運行下去,但是會提示用戶,游戲數據鎖定。
類型8:現代動作類網游
從早期的韓國動作游戲開始,傳統的戰網動作類游戲和 RPG游戲開始嘗試融合。單純的動作游戲玩家容易疲倦,留存也沒有 RPG那麼高;而單純 RPG戰斗卻又慢節奏的乏味,無法滿足很多玩家激烈對抗的期望,於是二者開始融合成為新一代的:動作 + 城鎮 模式。玩家在城鎮中聚集,然後以開副本的方式幾個人出去以動作游戲的玩法來完成各種 RPG任務。本質就是一套 RPG服務端+副本服務端。由於每次副本時人物可以控制在8人以內,因此可以獲得更為實時的游戲體驗,讓玩家玩的更加爽快。
說了那麼多的游戲伺服器類型,其實也差不多了,剩下的類型大家拼湊一下其實也就是這個樣子而已。
⑵ 游戲伺服器架構和web伺服器架構的區別
1-技術有什麼區別
首先通信上目前的主流是HTTP協議和SOCKET這兩種(HTML5提供了一種新的協議,WebScoket,對此了解並不多,因此不做評論,以免誤導)。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為「一次連接」。
(註:在HTTP 1.1中則可以在一次連接中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。)
Socket又稱"套接字",應用程序通常通過"套接字"向網路發出請求或者應答網路請求。
以J2SDK-1.3為例,Socket和ServerSocket類庫位於http://java.net包中。ServerSocket用於伺服器端,Socket是建立網路連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。對於一個網路連接來說,套接字是平等的,並沒有差別,不因為在伺服器端或在客戶端而產生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。(摘自網路)
在WEB伺服器中,一般情況是只需要使用HTTP協議的。因為它不太需要去與瀏覽器進行主動推送,只需要響應瀏覽器的訪問就足夠了
而在游戲伺服器,這樣的連接方式肯定是不夠用的。很多時候游戲伺服器是需要主動推送消息,如系統廣播。
2-思維有什麼區別
WEB伺服器並不需要高頻即時通訊,對響應速度要求不高。而游戲伺服器,大多數是需要很及時的響應速度(暫不討論弱聯網游戲)。如DOTA,這種競技類型的游戲,1秒就能發生很多事。
因此,在思考方向上,WEB伺服器應該考慮是的多平台的兼容,大量用戶訪問的高並發。
而游戲伺服器應該考慮的是高頻通訊,高並發。
3-架構的側重點有什麼區別
在架構上面,一般訪問量不是很大的網站是只有一台伺服器的,訪問量高的才會進行分布式設計或者集群設計。
而大部分游戲伺服器都是需要分布式設計的。
在現有的網路游戲伺服器端架構中,多是以功能和場景來劃分伺服器結構的。具體的劃分是根據項目的需求進行的,並沒有一個十分通用的架構。
以上是比較常見的結構,客戶端登錄的時候,連接GateServer,然後由GateServer去連接LoginServer進行登錄。登錄後通過CenterServer轉發到GameServer(GameServer即是伺服器大區)。
而其中的DCServer,主要的功能是緩存玩家角色數據,保證角色數據能快速的讀取和保存。
LogServer便是保存日誌的了。
4-本質有無區別
本質上,兩者並無區別,只是需求不同,側重點不同罷了。
⑶ 伺服器架構是什麼意思
所謂伺服器架構,也就是如何將伺服器各部分合理地安排,以實現最初的功能需求。所以,架構本無所謂正確與錯誤;當然,優秀的架構更有助於系統的搭建,對系統的可擴展性及可維護性也有更大的幫助。
⑷ 手機里的google play服務框架是什麼東西
google服務框架理解為安卓系統中的一個小的系統。
安卓系統是由google開發的,這個大家都知道。而google的原生系統,就是依靠這個服務框架來讓你的手機連接google的應用商店(google play)的,同時也是依靠這個服務框架實現更新應用,同步游戲存檔,還有應用或者游戲的內購。
平台優勢
1、開放性
在優勢方面,Android平台首先就是其開放性,開發的平台允許任何移動終端廠商加入到Android聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨著用戶和應用的日益豐富,一個嶄新的平台也將很快走向成熟。
2、豐富的硬體
這一點還是與Android平台的開放性相關,由於Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到數據同步、甚至軟體的兼容,如同從諾基亞Symbian風格手機一下改用蘋果iPhone。
3、方便開發
Android平台提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別致的軟體會誕生。
4、Google應用
在互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成為連接用戶和互聯網的重要紐帶,而Android平台手機將無縫結合這些優秀的Google服務。
⑸ 安卓大型游戲需要谷歌框架是什麼意思
安卓大型游戲需要谷歌框架的意思:
依靠這個服務框架實現更新應用,同步游戲存檔,還有應用或者游戲的內購,所以當你沒有谷歌套件的時候便無法進行游戲。
很多大型游戲是需要登陸谷歌市場的。因為谷歌市場提供了正規的游戲購買的支持,能綁定信用卡支付,受大型游戲公司青睞。只有通過谷歌框架才能讓游戲正常運行。
(5)什麼是游戲伺服器框架擴展閱讀:
谷歌是一家位於美國的跨國科技企業,業務包括互聯網搜索、雲計算、廣告技術等,同時開發並提供大量基於互聯網的產品與服務,其主要利潤來自於AdWords等廣告服務。
Google 服務框架是 Android 系統官方服務框架,作為谷歌軟體的運行平台。由於 Google 退出中國市場,中國上市的手機在出廠的時候都不會內置谷歌服務,取而代之的是各大手機廠商自家的服務體系。
⑹ golang有哪些不錯的游戲伺服器框架
為什麼golang的開發效率高?
golang是一編譯型的強類型語言,它在開發上的高效率主要來自於後發優勢,不用考慮舊有惡心的歷史,又有一個較高的工程視角。良好的避免了程序員因為「 { 需不需要獨佔一行 」這種革命問題打架,也解決了一部分趁編譯時間找產品妹妹搭訕的階級敵人。
它有自己的包管理機制,工具鏈成熟,從開發、調試到發布都很簡單方便;
有反向介面、defer、coroutine等大量的syntactic sugar;
編譯速度快,因為是強類型語言又有gc,只要通過編譯,非業務毛病就很少了;
它在語法級別上支持了goroutine,這是大家說到最多的內容,這里重點提一下。首先,coroutine並不稀罕,語言並不能超越硬體、操作系統實現神乎其神的功能。golang可以做到事情,其他語言也可以做到,譬如c++,在boost庫裡面自己就有的coroutine實現(當然用起來跟其他boost庫一樣惡心)。golang做的事情,是把這一套東西的使用過程簡化了,並且提供了一套channel的通信模式,使得程序員可以忽略諸如死鎖等問題。
goroutine的目的是描述並發編程模型。並發與並行不同,它並不需要多核的硬體支持,它不是一種物理運行狀態,而是一種程序邏輯流程。它的主要目的不是利用多核提高運行效率,而是提供一種更容易理解、不容易出錯的語言來描述問題。
實際上golang默認就是運行在單OS進程上面的,通過指定環境變數GOMAXPROCS才能轉身跑在多OS進程上面。有人提到了的pomelo,開源本來是一件很不錯的事情,但是基於自己對callback hell的偏見,我一直持有這種態度:敢用nodejs寫大規模游戲伺服器的人,都是真正的勇士 : ) 。
2、Erlang與Golang的coroutine有啥區別,coroutine是啥?
coroutine本質上是語言開發者自己實現的、處於user space內的線程,無論是erlang、還是golang都是這樣。需要解決沒有時鍾中斷;碰著阻塞式io,整個進程都會被操作系統主動掛起;需要自己擁有調度控制能力(放在並行環境下面還是挺麻煩的一件事)等等問題。那為啥要廢老大的勁自己做一套線程放user space裡面呢?
並發是伺服器語言必須要解決的問題;
system space的進程還有線程調度都太慢了、佔用的空間也太大了。
把線程放到user space的可以避免了陷入system call進行上下文切換以及高速緩沖更新,線程本身以及切換等操作可以做得非常的輕量。這也就是golang這類語言反復提及的超高並發能力,分分鍾給你開上幾千個線程不費力。
不同的是,golang的並發調度在i/o等易發阻塞的時候才會發生,一般是內封在庫函數內;erlang則更誇張,對每個coroutine維持一個計數器,常用語句都會導致這個計數器進行rection,一旦到點,立即切換調度函數。
中斷介入程度的不同,導致erlang看上去擁有了preemptive scheling的能力,而golang則是cooperative shceling的。golang一旦寫出純計算死循環,進程內所有會話必死無疑;要有大計算量少io的函數還得自己主動叫runtime.Sched()來進行調度切換。
3、golang的運行效率怎麼樣?
我是相當反感所謂的pingpong式benchmark,運行效率需要放到具體的工作環境下面考慮。
首先,它再快也是快不過c的,畢竟底下做了那麼多工作,又有調度,又有gc什麼的。那為什麼在那些benchmark裡面,golang、nodejs、erlang的響應效率看上去那麼優秀呢,響應快,並發強?並發能力強的原因上面已經提到了,響應快是因為大量非阻塞式io操作出現的原因。這一點c也可以做到,並且能力更強,但是得多寫不少優質代碼。
然後,針對游戲伺服器這種高實時性的運行環境,GC所造成的跳幀問題確實比較麻煩,前面的大神 @達達 有比較詳細的論述和緩解方案,就不累述了 。隨著golang的持續開發,相信應該會有非常大的改進。一是屏蔽內存操作是現代語言的大勢所趨,它肯定是需要被實現的;二是GC演算法已經相當的成熟,效率勉勉強強過得去;三是可以通過incremental的操作來均攤cpu消耗。
用這一點點效率損失換取一個更高的生產能力是不是值得呢?我覺得是值得的,硬體已經很便宜了,人生苦短,讓自己的生活更輕松一點吧: )。
4、基於以上的論述,我認為採用go進行小范圍的MMORPG開發是可行的。
⑺ 伺服器架構是什麼意思
常見的伺服器架構有以下三種:
伺服器集群架構:
伺服器集群就是指將很多伺服器集中起來一起進行同一種服務,在客戶端看來就像是只有一個伺服器。集群可以利用多個計算機進行並行計算從而獲得很高的計算速度,也可以用多個計算機做備份,從而使得任何一個機器壞了整個系統還是能正常運行。
伺服器負載均衡架構:
負載均衡
(Load
Balancing)
建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴展網路設備和伺服器的帶寬、增加吞吐量、加強網路數據處理能力、提高網路的靈活性和可用性。
分布式伺服器架構:
所謂分布式資源共享伺服器就是指數據和程序可以不位於一個伺服器上,而是分散到多個伺服器,以網路上分散分布的地理信息數據及受其影響的資料庫操作為研究對象的一種理論計算模型伺服器形式。分布式有利於任務在整個計算機系統上進行分配與優化,克服了傳統集中式系統會導致中心主機資源緊張與響應瓶頸的缺陷,解決了網路GIS
中存在的數據異構、數據共享、運算復雜等問題,是地理信息系統技術的一大進步。
這個三種架構都是常見的伺服器架構,集群的主要是IT公司在做,可以保障重要數據安全;負載均衡主要是為了分擔訪問量,避免臨時的網路堵塞,主要用於電子商務類型的網站;分布式伺服器主要是解決跨區域,多個單個節點達到高速訪問的目前,一般是類似CDN的用途的話,會採用分布式伺服器。