為什麼王者榮耀不使用微服務架構?

来源:https://www.cnblogs.com/javastack/archive/2023/12/06/17879597.html
-Advertisement-
Play Games

來源:zhihu.com/question/359630395/answer/954452799 今天,在知乎上看到這樣一個問題:"為什麼游戲公司的server不願意微服務化?" 背景介紹 最近面試了一家游戲公司(滿大間的,有上市) 我問他,公司有沒有做微服務架構的打算及考量? 他很驚訝的說,我沒聽 ...


來源:zhihu.com/question/359630395/answer/954452799

今天,在知乎上看到這樣一個問題:"為什麼游戲公司的server不願意微服務化?"

背景介紹

最近面試了一家游戲公司(滿大間的,有上市)

我問他,公司有沒有做微服務架構的打算及考量?

他很驚訝的說,我沒聽說過微服務耶,你可以解釋一下嗎?

我大概說了,方便測試,方便維護,方便升級,服務之間松耦合,可多語言開發,自動擴容…之類的點。

然後他說游戲server不太需要微服務,因為要求real time,做微服務會影響效能,分模組來開發就好了。

我也不確定,但微服務不是趨勢嗎?特別是大公司,游戲server的服務應該很容易拆分吧?

推薦一個開源免費的 Spring Boot 實戰項目:

https://github.com/javastacks/spring-boot-best-practice

hongjic93 是這樣回答的

比如moba類游戲/王者榮耀/LOL,就看王者榮耀的客戶端吧,想象一下。

賬號系統,符文系統,英雄系統,皮膚系統,好友系統,好友之間messaging,這些都是常規操作,如果流量足夠大,當然可以用微服務的架構去做。

不過這不是這個游戲的核心,核心是MOBA:Multiplayer online battle arena。特性是什麼?

10個人之間各種游戲事件的高速多向通訊 streaming/broadcast/multicast/pubsub各種通訊模式。

所以游戲的核心在於小規模群體之間的高速網路通信。就是對方說的realtime。多了一個10ms的延遲玩家就要罵娘了。

1、微服務為了把業務完美拆解,把原來的同一個進程里的模塊拆分成不同的服務,顯著增加額外的網路開銷。更別說什麼service mesh,各種gateway,proxy,sidecar,簡直就是擔心延遲太低。

2、微服務基本只有request/response的模式。做不了streaming?微服務通常要求應用是無狀態的才能做到水平擴展。streaming本身就是加入了狀態

3、我可以想像,為了提高通訊的性能,一場英雄聯盟游戲很可能會使用同一個伺服器負責這10個玩家之間的通訊,這樣就使得數據可以在本地交換,性能最大化。這對客戶端或者說服務端統一網關的要求是必須支持sticky routing。假設客戶端連接斷了,接下來的必須重連之前的同一個伺服器。微服務的stateless,水瓶擴展要求本身就是反sticky routing的,因為sticky routing本身就是狀態。

4、對服務端集群來說,同時有無數個王者榮耀的比賽在進行,每個都可以看成一個沙盒,每個沙盒都處於一個不同的狀態:塔被推了幾個了,你被殺了幾次了,對面幾個超神了,20分鐘到了沒。

這些都是長時間存在的狀態,直到游戲結束,服務端才可以清理一場游戲的狀態。所以雖然不用把這些狀態寫進持久性存儲,但是必然會在記憶體中存在很長時間。

都是狀態,反正有狀態,就別想用微服務。除非你說把這些狀態都移到redis里去,那麼在伺服器在信息流傳輸到一半還要做一個remote request,一來一回,延遲就上升了。

總之怎樣都不好。(比如想象對方在A你的水晶,每一次A的操作都是一個event,被streaming到服務端的沙盒中,沙盒中有一個流處理器,每次接收到一個你水晶被A的event都會計算一下你水晶爆了沒。這個計算需要極快,你是不可能把你水晶生命值的數據存在遠端的)。

像這類游戲,都是對網路,記憶體,CPU的優化需求很高,整個游戲進行過程中,幾乎不存在什麼RPC call,真的需要remote data,也應該是prefetch,就是在游戲剛開始的時候載入好。

微服務不是什麼銀彈,也就是方便拆解一下原來的CRUD應用罷了而已,一沒觸及高級的交互方式,二沒觸及分散式系統真正的難點:狀態,其實沒有大家想的那麼有用。之所以感覺上好像微服務改變了互聯網,只不過90%的互聯網應用都只是簡單小規模的CRUD而已。

對方沒有聽說過微服務完全沒有問題,因為這本身就不是什麼高深的概念,反而對方聽你一說一下就知道微服務不適合游戲,說明對方理解能力很強,對游戲系統設計也瞭解足夠深。

brice 是這樣回答到

做過棋牌游戲(游戲最簡單的一種),可以嘗試說幾個點:

1、微服務本身是為了應對業務邏輯的複雜,需要要的新的組織介面的方式。游戲本身邏輯其實沒有這麼複雜,比如大廳就是一些基本功能,修改帳號,登錄等。游戲本身就是游戲本身的邏輯。

2、游戲邏輯伺服器本身(比如鬥地主等棋牌)因為網路響應性能要求問題(玩家對每個操作的反饋時長敏感度遠高於業務系統),所以游戲伺服器都是有狀態的,狀態就存在記憶體,偶爾會接受redis,mysql等是絕對不可以的接受的,關係行資料庫僅用來定時非同步持久化數據,僅游戲伺服器而言持久化在redis即可。

3、游戲伺服器一般純需要主動推送,所以第一代微服務網關就沒辦法滿足需求, tcp的沒有網關用,spring cloud gateway的web socket也許可以用(但是從防攻擊角度講端游用TCP絕對比web socket合理)。

4、服務間通信rpc首先ribbon,feign等並不是合適,因為都是基於http的,用Http存在一個消息亂序問題,比如玩家出牌兩次,在http就可能出現次序不一致。游戲伺服器集群一般使用長連接互聯。可能需要用dubbo?(聽說是長連接)

5、游戲邏輯伺服器(比如鬥地主伺服器),一般是不能用spring mvc做的,因為線程模型完全不同。多線程模型處理游戲性能差還非常複雜,一般都是使用單進程/線程 驅動固定數量房間的方式(這也是為何伺服器一定有狀態,一定不能直接讀寫mysql)。一般就直接netty了

6、自動擴容在游戲這邊叫做開服,早就有固定流程和工具和限流方式了

7、游戲很多操作不存在服務降級熔斷,不行就要直接報錯給用戶。

8、大廳伺服器登錄註冊等的確可以做微服務,但是其實也不是做微服務,就是幾個介面有自動水平擴容的方案即可。服務註冊發現用處不大,開服都是確定的事情,還有一系列運營手段配合,關服也是絕對不能隨便關的。

9、游戲處理的流量真的不算多,你線上1萬的棋牌游戲已經很賺錢了,10W就是個特別厲害的產品了。

10、一些獨立的伺服器比如充值之類的需要微服務化麽?只能說這種伺服器都需要微服務處理了,項目組做夢都能笑醒。

雖然上面說了很多點,但是其實也是可以考慮用spring cloud改造的,因為游戲集群一樣有註冊中心,需要服務發現,需要編排啟動順序,只是spring cloud沒有為了游戲設計而已,比如至少要完全支持 webflux吧,需要一個單線程的長連接最好支持protobuf rpc框架吧(集成服務發現相關功能與介面),網關支持tcp或者至少封裝或者暴露一些netty的decoder encoder(或者允許註入)等等。

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫在前面 這篇文章被擱置真的太久了,不知不覺拖到了周三了,當然,也算跟falsk系列說再見的時候,真沒什麼好神秘的,就是個資料庫操作,就大家都知道的CRUD吧。 Flask SQLAlchemy的使用 1、Flask SQLAlchemy簡介 Flask SQLAlchemy 是基於 Flask w ...
  • MinTray 說明 實現程式關閉時最小化托盤的功能 托盤實現顯示主頁面和退出的功能 支持擴展,直接引用TrayIcon類即可,對外暴露介面 單例實現,可復用 警告 註:博主所有資源永久免費,若有幫助,請點贊轉發是對我莫大的幫助 註:博主本人學習過程的分享,引用他人的文章皆會標註原作者 註:本人文章 ...
  • 變數、運算符、表達式、輸入與輸出 tip:[start]編程是一種控制電腦的方式,和我們平時雙擊打開文件、關機、重啟沒有任何區別——閆學燦tip:[end] 1.編寫一個簡單的Java程式–手速練習 /* step1:創建一個java源文件:HelloWorld.java 將編寫的java代碼保存 ...
  • 你是否曾想過為什麼在 Spring Boot 應用中緩存是如此重要?答案在於它通過減少數據檢索時間來提高性能。在本文中,我們將深入探討緩存對微服務模式的影響,並探討根據操作易用性、速度、可用性和可觀測性等因素選擇正確緩存的重要性。我們還將探討如何最大程度地提高緩存性能和可用性。 1 緩存實現 1.1 ...
  • 項目背景 原有的啟動平臺公共組件庫comm-util的瀏覽器工具類BrowserUtils是基於UserAgentUtils的,但是該項目最後一個版本發佈於 2018/01/24,之至今日23年底,已有5年沒有維護更新,會造成最新版本的部分瀏覽器不能正確獲取到瀏覽器信息。(至於為什麼停更了獲取不到最 ...
  • 現象描述:Spring Boot項目,啟動的時候卡住了,一直卡在那裡不動,沒有報錯,也沒有日誌輸出 但是,奇怪的是,本地可以正常啟動 好吧,姑且先不深究為什麼本地可以啟動而部署到伺服器上就無法啟動的問題,這個不是重點,重點是怎麼讓它啟動起來。(PS:我猜測可能是環境不同造成的,包括操作系統不同和JD ...
  • 如圖所示,項目中定義了這樣幾個模塊: pdd-workflow-build :定義項目版本,及全局配置 pdd-workflow-dependencies :外部依賴管理,統一管理所有用到的外部依賴的版本 pdd-workflow-service :項目service模塊 pdd-workflow- ...
  • 在日常項目開發中,可能會遇到使用 ES 做關鍵詞搜索的場景,但是一般來說業務數據是不會直接通過 CRUD 寫進 ES 的。 因為這可能違背了 ES 是用來查詢的初衷,數據持久化的事情可以交給資料庫來做。那麼,這裡就有一個顯而易見的問題:ES 里的數據從哪裡來? 本文介紹的就是如何將 MySQL ... ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...