使用 Azure 容器實(shí)例 (ACI) 實(shí)現(xiàn)同步多人游戲

來源: Microsoft Azure
作者:Microsoft Azure
時間:2021-01-05
17713
探索此使用Azure容器實(shí)例、事件網(wǎng)格和Azure Functions的替代解決方案,它可按需自動縮放,且按每秒使用量計費(fèi),前提是您希望以支付較高價格為代價,利用托管虛擬機(jī)實(shí)現(xiàn)更簡單的體系結(jié)構(gòu)和維護(hù)工作。

探索此使用Azure容器實(shí)例、事件網(wǎng)格和Azure Functions的替代解決方案,它可按需自動縮放,且按每秒使用量計費(fèi),前提是您希望以支付較高價格為代價,利用托管虛擬機(jī)實(shí)現(xiàn)更簡單的體系結(jié)構(gòu)和維護(hù)工作。

服務(wù)器需要在Azure容器實(shí)例之外保持持久狀態(tài)。

本文將描述GitHub上的此示例中使用的體系結(jié)構(gòu)。請注意,此參考體系結(jié)構(gòu)中的代碼只是一個指南示例,在用于生產(chǎn)環(huán)境之前,可能還有需要優(yōu)化的地方。

體系結(jié)構(gòu)關(guān)系圖

multiplayer-aci-hosting.png

相關(guān)服務(wù)

Azure流量管理器-選擇此服務(wù)是因?yàn)樗梢愿鶕?jù)延遲情況將玩家連接到最合適的區(qū)域。

Azure容器實(shí)例-在Azure中運(yùn)行容器的最快且最簡單的方法,無需管理任何虛擬機(jī),也無需采用更高級別的服務(wù)。

Azure Functions-選擇此服務(wù)是因?yàn)樗沁\(yùn)行小部分邏輯的最簡單方法。

Azure表存儲-用于跟蹤容器組狀態(tài)的簡單的鍵/屬性存儲。

Azure事件網(wǎng)格-選擇此服務(wù)是因?yàn)樗鼉?nèi)置針對來自Azure服務(wù)的事件的支持。

Azure Blob存儲-我們需要一個用于存儲自動縮放幫助程序配置的空間。

資源組-針對Azure流量管理器使用一個資源組,并針對每個區(qū)域游戲服務(wù)器池各使用一個資源組(例如,一個用于北美、一個用于歐洲、一個用于拉丁美洲、一個用于亞洲等)。

部署模板

單擊下面的按鈕,將項(xiàng)目部署到您的Azure訂閱:

azure-resource-manager-deploy-button.png

Deploy using an Azure Resource Manager template

此操作將觸發(fā)模板部署,即系統(tǒng)會將azuredeploy.json ARM模板文件部署到您的Azure訂閱,從而創(chuàng)建必要的Azure資源并從此存儲庫中提取源代碼。這可能會在您的Azure帳戶中產(chǎn)生相應(yīng)費(fèi)用。

請查看一般指南文檔,其中有一篇文章概述了Azure服務(wù)的命名規(guī)則和限制。

要部署項(xiàng)目,需要指定以下信息:

位置:選擇將部署資源的Azure區(qū)域。請確保選擇Azure容器實(shí)例可用的位置。

Function名稱:選擇Function App的唯一名稱。這將確定Function的DNS,請謹(jǐn)慎選擇。

存儲庫URL:系統(tǒng)將拉取相應(yīng)文件來創(chuàng)建Azure Functions,而此URL將確定包含這些文件的存儲庫。您可以保留默認(rèn)值,或者換成自己的Fork。

分支:此值與項(xiàng)目的GitHub分支相對應(yīng)。

Azure Functions部署在免費(fèi)的應(yīng)用程序服務(wù)計劃上,您可能需要對它進(jìn)行擴(kuò)展以提高性能。

項(xiàng)目使用托管服務(wù)標(biāo)識及其與Azure Functions的關(guān)系來對Azure ARM API管理服務(wù)進(jìn)行身份驗(yàn)證,從而創(chuàng)建/刪除/修改所需的Azure容器實(shí)例。部署腳本會自動為Function App創(chuàng)建應(yīng)用程序標(biāo)識,但您需要向?qū)⒁泄苋萜鲗?shí)例的資源組授予此標(biāo)識權(quán)限。為此,請執(zhí)行以下操作:

訪問Azure門戶。

找到要在其中創(chuàng)建Azure容器實(shí)例的資源組(這可能是托管Function App的同一資源組)。

選擇訪問控制(IAM)。

單擊添加,選擇貢獻(xiàn)者作為角色,向Function App分配訪問權(quán)限,然后通過修改訂閱/資源組下拉框來選擇Azure Functions。

單擊保存,就完成操作了!

此外,部署完成后,您需要按照此處的說明手動添加ACIMonitor Function的事件訂閱Webhook。只需確保選擇正確的資源組來監(jiān)控事件(即將在其中創(chuàng)建容器的Azure資源組)。這樣一來,只要指定資源組中發(fā)生資源修改,事件網(wǎng)格便會立即向ACIMonitor Function發(fā)送消息。完成此操作后,部署就準(zhǔn)備就緒了。獲取ACIMonitor Function的URL后,您可以使用此ARM模板來部署事件網(wǎng)格訂閱,這是一項(xiàng)可選操作。

使用門戶部署事件網(wǎng)格訂閱時,需要填寫以下值:

名稱-為事件網(wǎng)格訂閱選擇一個獨(dú)特的名稱。

主題類型-選擇“資源組”(如果Azure容器實(shí)例將部署在不同的資源組中,請選擇“Azure訂閱”)。

訂閱-要用來監(jiān)控Azure容器實(shí)例創(chuàng)建事件的訂閱。

資源組-選擇將包含您創(chuàng)建的Azure容器實(shí)例的資源組。請確保選中訂閱所有事件類型復(fù)選框。

訂閱服務(wù)器類型-Webhook。

訂閱終結(jié)點(diǎn)-這將包含ACIMonitor Azure Functions的觸發(fā)器URL。

前綴篩選器-將其保留為空。

后綴篩選器-將其保留為空。

最后但同樣重要的是,使用新的Azure Functions v2運(yùn)行時版本時,EventGrid綁定擴(kuò)展可能需要手動注冊。在正常情況下,擴(kuò)展將自動安裝(因?yàn)樗栽趀xtensions.csproj文件中),但如果沒有自動安裝,您可以查看以下文章了解如何手動執(zhí)行此操作:

Azure Functions注冊綁定擴(kuò)展。

從門戶手動安裝或更新Azure Functions綁定擴(kuò)展。

分步操作

玩家的設(shè)備客戶端連接到流量管理器,以傳送要查找游戲服務(wù)器的玩家請求。

流量管理器連接到具有最低延遲的區(qū)域,并指向可獲取可用游戲服務(wù)器的Matchmaker。

Matchmaker調(diào)用ACIList Azure Functions以獲取來自所有容器組的公共IP和活動會話列表。

該Azure Functions從Azure表存儲中獲取表,而該表存儲將存儲所有容器組中的公共IP、活動會話數(shù)量和狀態(tài)。

假設(shè)沒有可用的表,系統(tǒng)將調(diào)用ACICreate Azure Functions。容器狀態(tài)為Creating。

ACICreate Azure Functions創(chuàng)建容器。

創(chuàng)建或刪除容器時,系統(tǒng)接入事件網(wǎng)格進(jìn)行偵聽。片刻之后(幾分鐘),事件網(wǎng)格收到來自正在創(chuàng)建的容器的相關(guān)事件。

事件網(wǎng)格還進(jìn)行了設(shè)置,可在收到事件后調(diào)用ACIMonitor Azure Functions,以便傳遞公共IP。

ACIMonitor Azure Functions插入來自新創(chuàng)建容器的公共IP,并將該容器的狀態(tài)設(shè)置為Running。

Matchmaker現(xiàn)在為玩家獲得了一臺可用服務(wù)器,它將詳細(xì)信息發(fā)回設(shè)備客戶端,以便設(shè)備客戶端直接連接到服務(wù)器。

Matchmaker調(diào)用ACISetSession Azure Functions,以更新玩家被指派連接的容器上運(yùn)行的活動會話數(shù)量。

ACISetSession Function更新Azure表存儲。

到某個時刻后,將不再需要服務(wù)器。由于玩家可能仍在使用容器實(shí)例,因此本例不會手動刪除容器,而是調(diào)用ACISetState Azure Functions來將容器的狀態(tài)設(shè)置為MarkedForDeletion,這樣一來,新玩家就不會被安排到該容器實(shí)例。

ACISetState Azure Functions更新Azure表存儲。

時間觸發(fā)的ACIGC Azure Functions會時不時地運(yùn)行,并刪除所有具有MarkedForDeletion狀態(tài)的容器實(shí)例。

ACIGC Azure Functions調(diào)用可實(shí)際刪除容器實(shí)例的ACIDelete Azure Functions。

ACIDelete Azure Functions刪除容器。

使用更具體的示例:

aci-workflow-diagram-2.png

一開始沒有服務(wù)器實(shí)例。

突然,玩家需要服務(wù)器進(jìn)行連接,系統(tǒng)調(diào)用了ACICreate。

執(zhí)行創(chuàng)建命令時,服務(wù)器尚未啟動和運(yùn)行,狀態(tài)為Creating。

完成部署后(幾分鐘),事件網(wǎng)格將通過ACIMonitor通知您服務(wù)器實(shí)例(容器組1)正在特定的IP地址(即1.2.3.4)中運(yùn)行。系統(tǒng)將該實(shí)例的狀態(tài)更新為Running。

玩家現(xiàn)在可以連接到服務(wù)器實(shí)例。

假設(shè)現(xiàn)在需要另一個服務(wù)器實(shí)例。您可以再次使用ACICreate,或者如果已超出橫向擴(kuò)展閾值,則讓ACIAutoScaler代表您使用ACICreate創(chuàng)建實(shí)例。

還是同樣的模式,新服務(wù)器尚未準(zhǔn)備就緒,當(dāng)部署完成后,事件網(wǎng)格將通過ACIMonitor通知您服務(wù)器在另一個特定IP地址(即2.3.4.5)中運(yùn)行。系統(tǒng)將這第二個實(shí)例(容器組2)的狀態(tài)更新為Running。

玩家現(xiàn)在可以連接到第二個實(shí)例。

最后,不需要第二個實(shí)例,我們決定不使用它或者超出了擴(kuò)展閾值。由于可能有玩家仍在使用第二個實(shí)例,因此系統(tǒng)不會刪除該實(shí)例,而是調(diào)用ACISetScale將服務(wù)器標(biāo)記為刪除,這樣一來,新玩家就不會被安排到第二個實(shí)例。現(xiàn)在,第二個實(shí)例的狀態(tài)是MarkedForDeletion。

當(dāng)玩家在第二個實(shí)例中結(jié)束游戲后,系統(tǒng)將運(yùn)行垃圾回收器ACIGB,并觸發(fā)ACIDelete以完全刪除第二個實(shí)例。

縮放

可通過以下環(huán)境變量配置ACIAutoScaler Azure Functions設(shè)置:擴(kuò)展/收縮閾值、最小/最大實(shí)例數(shù)以及冷卻。下面是自動縮放器的邏輯:

計時觸發(fā),每隔1分鐘運(yùn)行一次,默認(rèn)禁用。

負(fù)載為已連接的玩家數(shù)量/總玩家容量。

如果(“負(fù)載”>80%且實(shí)例<最大實(shí)例數(shù)),則調(diào)用ACICreate Azure Functions以加快啟動新實(shí)例。這可以處理好擴(kuò)展情形。

如果(“負(fù)載”<60%且實(shí)例>最小實(shí)例數(shù)),則調(diào)用ACISetState Azure Functions,將負(fù)載最小的實(shí)例的狀態(tài)設(shè)置為MarkedForDeletion。這可以處理好收縮情形。

擴(kuò)展/收縮有10分鐘的冷卻期。

Azure容器實(shí)例可以快速實(shí)現(xiàn)擴(kuò)展,只需幾分鐘,您便可以隨時開始使用新容器。例如,對于擴(kuò)展30個運(yùn)行OpenArena的新Azure容器實(shí)例的請求,從請求發(fā)出到玩家能夠連接,用時不到3分鐘。

手動創(chuàng)建一組容器進(jìn)行測試

如果您想創(chuàng)建一組容器實(shí)例進(jìn)行測試,可以使用此處提供的示例。將openarenaserver1替換為您要創(chuàng)建的各個實(shí)例的唯一名稱(如openarenaserver1、openarenaserver2、openarenaserver3等)。您還可以替換資源組、位置和存儲名稱/鍵。

其他資源和示例

請觀看Build上錄制的使用Azure容器實(shí)例實(shí)現(xiàn)多人游戲服務(wù)器縮放視頻,了解詳細(xì)信息。

定價

如果您沒有Azure訂閱,可以創(chuàng)建免費(fèi)帳戶,開始使用12個月的免費(fèi)服務(wù)。除非您超出這些服務(wù)的使用限制,否則無需為Azure免費(fèi)帳戶中包含的這些免費(fèi)服務(wù)付費(fèi)。了解如何通過Azure門戶或使用情況文件查看服務(wù)使用情況。

您需要承擔(dān)運(yùn)行這些參考體系結(jié)構(gòu)時使用的Azure服務(wù)的費(fèi)用,總金額取決于將通過分析管道運(yùn)行的事件數(shù)。請參閱參考體系結(jié)構(gòu)中使用的每項(xiàng)服務(wù)的定價網(wǎng)頁:

Azure流量管理器

Azure容器實(shí)例

Azure Functions

Azure事件網(wǎng)格

Azure表存儲和Azure Blob存儲

您還可以使用Azure定價計算器,以配置和估算您計劃使用的Azure服務(wù)的成本。

立即登錄,閱讀全文
版權(quán)說明:
本文內(nèi)容來自于Microsoft Azure,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個人觀點(diǎn),不代表快出海對觀點(diǎn)贊同或支持。如有侵權(quán),請聯(lián)系管理員(zzx@kchuhai.com)刪除!
優(yōu)質(zhì)服務(wù)商推薦
更多
個人VIP