為什麼手游伺服器一般將登陸伺服器和遊戲伺服器分開?

用java ee做遊戲伺服器,將遊戲邏輯和登陸邏輯打包在同一個war文件中。但是網上很多資料都是登陸伺服器和遊戲伺服器分開,問一下,這樣做有什麼優勢?附帶問一下,有沒有跟我一樣將遊戲邏輯和登陸邏輯打包在同一個war?


把遊戲登陸邏輯單獨成一個服務的優點有如下幾點:

  1. 登陸入口唯一.:遊戲如果不是自己運營,則需要上其他平台。每個平台只能有一個登陸伺服器,但是遊戲邏輯伺服器要跟著玩家數量的增加而增加。

  2. 方便擴展:遊戲可能會在多個平台一起運營,不同的平台對登陸的處理方式可能不一樣。單獨把登陸部分分開的話,只要修改登陸服務的代碼,然後發布就可以了,其他部分的伺服器不需要做任何修改。

  3. 部署靈活:遊戲中玩家數量較少的時候,可以將登陸服和邏輯符部署到一台物理伺服器上。當玩家增多,伺服器壓力增大時,可以將登陸服單獨部署到性能更強大的物理伺服器上。

  4. 減少耦合:登陸服和邏輯服獨立後,登陸服掛了不會影響正在遊戲中的玩家。某一個邏輯服掛了也不會影響到登陸。


因為現在手游幾乎全部是運營商和開發商(CP)分開的模式了。

================

首先大概介紹一下運營商的概念,或者換個現在更常用的說法,「渠道」。

因為如果對國內手游產業不是非常了解的話,可能不是很能理解國內手游產業中「渠道」的角色。

傳統的單機遊戲行業,開發商負責整個遊戲的研發,而真正的純單機遊戲並沒有「運營」的概念,所以只有所謂的「發行商」,負責對遊戲進行包裝、營銷和發售。例如《暗黑破壞神2》在中國的發行商是奧美,《伊森瘋狂賽車》在中國的發行商是天人互動。最後的營收則是由開發商和發行商按一定的比例瓜分。

而傳統的PC網遊(俗稱「端游」),由於有開發大型端游能力的公司往往也同時具有強大的運營能力(包括營銷推廣、維護伺服器、客服等等),因此開發商與運營商往往是同一家公司(如網易、完美、騰訊、西山居等等)。而國外的網遊如果要在中國市場運營,則往往會委託中國的公司來進行運營活動(也就是俗稱的「代理」)。而最後的營收同樣由開發商和運營商進行分成。例如《魔獸世界》與網易、《龍之谷》與盛大、CF(我就不打書名號了)與騰訊等等。也有極少數國內網遊由別家的國內公司進行運營。例如盛大也曾經運營過西山居的《劍網三》。然而這些遊戲由於往往是國外的公司全權委託給國內公司進行代理,因此往往賬號登陸和遊戲本身還是要通過同一家公司的伺服器。

而到了手游時代,整個產業的運作方式進行了一次大洗牌。所謂的「渠道」如今承擔了更重要的角色。因為這個時代的「渠道」商往往是幾年前霸佔了更多用戶流量資源的公司。例如有微信和QQ的騰訊、有貼吧等等的百度、有自己的手機平台的小米等等。由於擁有更多的用戶資源,這些平台往往比傳統的自研遊戲大廠本身的推廣能力要強上幾個數量級。許多端游大廠在轉型手游的過程中對於「渠道」的認識嚴重不足,往往都付出了慘痛的代價。如今「渠道」+開發商的模式已經成為常識。

需要指出的是,APPSTORE和國外的GOOGLEPLAY也是「渠道」的一種。APPSTORE的首頁推薦幾乎是蘋果平台上最有力的推廣手段。

===================

介紹完渠道的概念後,再來理解為何要把登陸和遊戲伺服器分開就很容易了。因為在手游時代,是個網遊都是要接入渠道登陸功能的,因此在開發遊戲的初期就應該把接入渠道的工作納入開發計劃之中。

一般運營的遊戲實際負責保存遊戲數據和執行服務端邏輯的伺服器由開發商進行部署和維護,而負責登陸的伺服器則由渠道負責部署和維護。由於渠道往往擁有很多現成的用戶,以及各種方便快捷的登陸方式(例如微信的自動登錄),而這些登陸方式不同平台往往差別很大,而渠道間的競爭也很激烈,因此大多數渠道都會通過給出現成的登陸模塊(SDK)和統一介面的方式供開發商進行接入。

不過要指出的是,這裡的「登陸」應該是只單純的用戶名密碼、遊客賬號等等單純的「驗證身份」的模塊。事實上,開發商在自己的遊戲伺服器中也會有單獨的登陸功能模塊。

舉個例子,現在有個由「NETHARD」的公司開發的叫《枕頭大戰》的遊戲在小米的平台上進行運營。

有個叫小A的玩家是小米的用戶,賬號是13854389438,昵稱是「巭孬嫑莪」。

然後他玩了小米上的《枕頭大戰》,用了小米的賬號進行登陸。

然後進入遊戲後他建了個叫「伊藤誠」的角色。

在普通玩家看來,這整個一套是一個非常簡單的登陸流程。但其實這裡面有三套可以稱之為「賬號」的系統。

首先是小米平台的賬號(13854389438 - 巭孬嫑莪)。這套賬號保存在小米的伺服器上。

在登陸了「巭孬嫑莪」後,NETHARD公司獲取了小米提供的身份驗證信息,如果這個身份是第一次在NETHARD的伺服器上登陸,那麼NETHARD的伺服器會為該用戶分配一個NETHARD內部的用戶身份,例如「13854389438%%MI」,並將這兩個身份進行映射。而每次「巭孬嫑莪」在用「13854389438」的賬號登陸《枕頭大戰》時,NETHARD的伺服器上也會自動通過「13854389438%%MI」的賬號進行登陸。

最後,存在NETHARD遊戲伺服器內的角色「伊藤誠」則相當於第三重賬號。由於現在的手游網遊往往在同一個賬號下的角色不共享貨幣(如常見的「元寶」、「鑽石」等等),因此在NETHARD的伺服器內,「伊藤誠」則是一個獨立的身份。而NETHARD的賬號系統則會將「伊藤誠」和「13854389438%%MI」再一次映射起來。

====================

最後需要指出的是,在上述的流程中其實是有三台伺服器存在的。分別是小米的登陸伺服器、將小米賬號「13854389438」和NETHARD賬號「13854389438%%MI」進行映射的伺服器以及將「13854389438%%MI」和「伊藤誠」進行映射的伺服器。而最後那台伺服器往往才是真正的遊戲伺服器。

至於為什麼要將第二台伺服器和第三台伺服器分開?因為除了「登陸」功能外,手游還有「計費」模塊。

NETHARD公司自然不會只有《枕頭大戰》一款遊戲。而NETHARD公司還有自己獨立的財務、審計,那麼玩家花的每一塊軟妹幣,最後都是要通過第二台伺服器的流水的。

當「伊藤誠」在遊戲里消費「¥100」買了一瓶「妹汁」時,首先第三台伺服器會生成一張訂單,告訴第二台伺服器「玩家13854389438%%MI買了道具No8989,訂單號XXX」。第二台伺服器則會告訴小米的伺服器「你的那個玩家13854389438買了道具No8989,訂單號XXX」。然後小米在自己的伺服器上查了下,道具No8989的售價是¥100(這個信息是遊戲在平台上發布前事先註冊好的信息),然後在獲得「伊藤誠」的確認後,小米和支付寶進行了一系列骯髒的交易,最後小米獲得了¥100,然後告訴第二台伺服器「已收到13854389438的贓款,可發放No8989,訂單號XXX已完成」,第二台再把該信息傳達給第三台伺服器,最後第三台伺服器(也就是遊戲伺服器)在遊戲里把妹汁發放給了「伊藤誠」先生。

當然這事兒還沒完,在月底時,小米會把¥100中應該分成給NETHARD的那一部分給NETHARD,然後兩家公司再各自給自己的臨時工們發了餉,大家就各回各家各找各媽了。


1. 不同功能分布在不同進程,可以在某個功能負載高的時候,通過添加機器來均衡負載,提高系統支撐上限

2. 有些功能,有獨立的登錄伺服器更好做,比如最早的遊戲,需要限制一個賬號不能在多組服同時登錄。此外,版署的防沉迷規定,是按照賬號來累計統計在線時間的,有單一登錄,更方便。


咦……這問題別邀請我,我也是關注狀態而已……我只是個策劃對伺服器具體架構並不能說的很詳細。

我只能說,我見過的遊戲基本上的登錄伺服器和邏輯伺服器都是分開運行和分開維護的。至於如何打包的我並不了解。

分開運行和維護的原因其實你也應該知道,邏輯伺服器經常由於各種bug導致宕機。當然就算後期不宕機的時候,邏輯伺服器的承載也遠遠高於登錄伺服器。

另外登錄伺服器需要接各種渠道賬號交互等功能,接各種不同的SDK之類的問題。

具體為什麼這麼分包,只能等專業的來解答了。


其實很簡單

生命周期相同的我們放在一起,生命周期不同的我們分開

你關遊戲伺服器並不一定會關登陸伺服器,反之也一樣,拆開是理所當然。


因為登陸伺服器壓力一般比較大…刷用戶的時候可能一分鐘過來幾百個用戶,而且用戶信息一定要立即存檔沒什麼優化的技巧只能硬上


防崩潰和負載均衡

還有防火牆功能


1.樓主的 war包 應該是 屬於 http鏈接的遊戲伺服器吧。war是發布在tomcat下面的

2.可以打包在一起,但是你保證邏輯伺服器別支持其他的功能就行。比如說登陸伺服器別執行遊戲伺服器功能就ok了

3.為什麼分開。為了避免登陸的擁堵。避免伺服器卡頓。因為網頁遊戲或者手機遊戲,在開新服的時候瞬間的流量是很高的。你要保證登陸成功的玩家不會因為登陸的玩家太多導致已經進入遊戲的玩家玩遊戲很卡頓,所以就必須分開。

4.關於分服。其實完全沒有必要這樣。開啟同一個進程。啟動多個消息處理線程就行了。1個消息線程只處理登陸消息,另外一個消息處理線程處理遊戲主邏輯消息。這樣就可以避免開新服時,玩家流量過多。導致遊戲卡頓


童鞋你做的是網遊吧,登錄服和遊戲服搞到一起,開服那天會很容易悲劇的。現在比較常用的做法是分散式+負載均衡器。

不然,你能想像好幾萬人來你家玩,從同一個小門進去的場景嗎。


問題涉及登錄和邏輯伺服器,猜測是網遊或者弱聯網遊戲,此類問題應該由項目主程或者負責人來決定,如果該同學無法確定此事,建議取消項目,不是裝逼,是泣血建議


java做伺服器的遊戲基本屬於低端產品。又不是複雜邏輯包裹的MMORPG端游,根本不用分開,這樣做簡直就是東施效顰。


推薦閱讀:

Linux 下多線程和多進程程序的優缺點,各自適合什麼樣的業務場景?
如何使用 Go 語言寫遊戲伺服器?
對於很多發燒級PC硬體玩家來說,伺服器cpu、recc內存和RAID陣列等等伺服器上的硬體或者技術真的有必要麼?
為何多個 http 的 80 埠的站點可以共用同一個伺服器(IP),而 https 卻不行?
如何寫一個web伺服器?

TAG:伺服器 | 手機遊戲 | Java | 遊戲伺服器 |