探索此使用Azure容器實(shí)例、事件網(wǎng)格和Azure Functions的替代解決方案,它可按需自動(dòng)縮放,且按每秒使用量計(jì)費(fèi),前提是您希望以支付較高價(jià)格為代價(jià),利用托管虛擬機(jī)實(shí)現(xiàn)更簡單的體系結(jié)構(gòu)和維護(hù)工作。
服務(wù)器需要在Azure容器實(shí)例之外保持持久狀態(tài)。
本文將描述GitHub上的此示例中使用的體系結(jié)構(gòu)。請(qǐng)注意,此參考體系結(jié)構(gòu)中的代碼只是一個(gè)指南示例,在用于生產(chǎn)環(huán)境之前,可能還有需要優(yōu)化的地方。
體系結(jié)構(gòu)關(guān)系圖
相關(guān)服務(wù)
Azure流量管理器-選擇此服務(wù)是因?yàn)樗梢愿鶕?jù)延遲情況將玩家連接到最合適的區(qū)域。
Azure容器實(shí)例-在Azure中運(yùn)行容器的最快且最簡單的方法,無需管理任何虛擬機(jī),也無需采用更高級(jí)別的服務(wù)。
Azure Functions-選擇此服務(wù)是因?yàn)樗沁\(yùn)行小部分邏輯的最簡單方法。
Azure表存儲(chǔ)-用于跟蹤容器組狀態(tài)的簡單的鍵/屬性存儲(chǔ)。
Azure事件網(wǎng)格-選擇此服務(wù)是因?yàn)樗鼉?nèi)置針對(duì)來自Azure服務(wù)的事件的支持。
Azure Blob存儲(chǔ)-我們需要一個(gè)用于存儲(chǔ)自動(dòng)縮放幫助程序配置的空間。
資源組-針對(duì)Azure流量管理器使用一個(gè)資源組,并針對(duì)每個(gè)區(qū)域游戲服務(wù)器池各使用一個(gè)資源組(例如,一個(gè)用于北美、一個(gè)用于歐洲、一個(gè)用于拉丁美洲、一個(gè)用于亞洲等)。
部署模板
單擊下面的按鈕,將項(xiàng)目部署到您的Azure訂閱:
Deploy using an Azure Resource Manager template
此操作將觸發(fā)模板部署,即系統(tǒng)會(huì)將azuredeploy.json ARM模板文件部署到您的Azure訂閱,從而創(chuàng)建必要的Azure資源并從此存儲(chǔ)庫中提取源代碼。這可能會(huì)在您的Azure帳戶中產(chǎn)生相應(yīng)費(fèi)用。
請(qǐng)查看一般指南文檔,其中有一篇文章概述了Azure服務(wù)的命名規(guī)則和限制。
要部署項(xiàng)目,需要指定以下信息:
位置:選擇將部署資源的Azure區(qū)域。請(qǐng)確保選擇Azure容器實(shí)例可用的位置。
Function名稱:選擇Function App的唯一名稱。這將確定Function的DNS,請(qǐng)謹(jǐn)慎選擇。
存儲(chǔ)庫URL:系統(tǒng)將拉取相應(yīng)文件來創(chuàng)建Azure Functions,而此URL將確定包含這些文件的存儲(chǔ)庫。您可以保留默認(rèn)值,或者換成自己的Fork。
分支:此值與項(xiàng)目的GitHub分支相對(duì)應(yīng)。
Azure Functions部署在免費(fèi)的應(yīng)用程序服務(wù)計(jì)劃上,您可能需要對(duì)它進(jìn)行擴(kuò)展以提高性能。
項(xiàng)目使用托管服務(wù)標(biāo)識(shí)及其與Azure Functions的關(guān)系來對(duì)Azure ARM API管理服務(wù)進(jìn)行身份驗(yàn)證,從而創(chuàng)建/刪除/修改所需的Azure容器實(shí)例。部署腳本會(huì)自動(dòng)為Function App創(chuàng)建應(yīng)用程序標(biāo)識(shí),但您需要向?qū)⒁泄苋萜鲗?shí)例的資源組授予此標(biāo)識(shí)權(quán)限。為此,請(qǐng)執(zhí)行以下操作:
訪問Azure門戶。
找到要在其中創(chuàng)建Azure容器實(shí)例的資源組(這可能是托管Function App的同一資源組)。
選擇訪問控制(IAM)。
單擊添加,選擇貢獻(xiàn)者作為角色,向Function App分配訪問權(quán)限,然后通過修改訂閱/資源組下拉框來選擇Azure Functions。
單擊保存,就完成操作了!
此外,部署完成后,您需要按照此處的說明手動(dòng)添加ACIMonitor Function的事件訂閱Webhook。只需確保選擇正確的資源組來監(jiān)控事件(即將在其中創(chuàng)建容器的Azure資源組)。這樣一來,只要指定資源組中發(fā)生資源修改,事件網(wǎng)格便會(huì)立即向ACIMonitor Function發(fā)送消息。完成此操作后,部署就準(zhǔn)備就緒了。獲取ACIMonitor Function的URL后,您可以使用此ARM模板來部署事件網(wǎng)格訂閱,這是一項(xiàng)可選操作。
使用門戶部署事件網(wǎng)格訂閱時(shí),需要填寫以下值:
名稱-為事件網(wǎng)格訂閱選擇一個(gè)獨(dú)特的名稱。
主題類型-選擇“資源組”(如果Azure容器實(shí)例將部署在不同的資源組中,請(qǐng)選擇“Azure訂閱”)。
訂閱-要用來監(jiān)控Azure容器實(shí)例創(chuàng)建事件的訂閱。
資源組-選擇將包含您創(chuàng)建的Azure容器實(shí)例的資源組。請(qǐng)確保選中訂閱所有事件類型復(fù)選框。
訂閱服務(wù)器類型-Webhook。
訂閱終結(jié)點(diǎn)-這將包含ACIMonitor Azure Functions的觸發(fā)器URL。
前綴篩選器-將其保留為空。
后綴篩選器-將其保留為空。
最后但同樣重要的是,使用新的Azure Functions v2運(yùn)行時(shí)版本時(shí),EventGrid綁定擴(kuò)展可能需要手動(dòng)注冊(cè)。在正常情況下,擴(kuò)展將自動(dòng)安裝(因?yàn)樗?cè)在extensions.csproj文件中),但如果沒有自動(dòng)安裝,您可以查看以下文章了解如何手動(dòng)執(zhí)行此操作:
Azure Functions注冊(cè)綁定擴(kuò)展。
從門戶手動(dòng)安裝或更新Azure Functions綁定擴(kuò)展。
分步操作
玩家的設(shè)備客戶端連接到流量管理器,以傳送要查找游戲服務(wù)器的玩家請(qǐng)求。
流量管理器連接到具有最低延遲的區(qū)域,并指向可獲取可用游戲服務(wù)器的Matchmaker。
Matchmaker調(diào)用ACIList Azure Functions以獲取來自所有容器組的公共IP和活動(dòng)會(huì)話列表。
該Azure Functions從Azure表存儲(chǔ)中獲取表,而該表存儲(chǔ)將存儲(chǔ)所有容器組中的公共IP、活動(dòng)會(huì)話數(shù)量和狀態(tài)。
假設(shè)沒有可用的表,系統(tǒng)將調(diào)用ACICreate Azure Functions。容器狀態(tài)為Creating。
ACICreate Azure Functions創(chuàng)建容器。
創(chuàng)建或刪除容器時(shí),系統(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)在為玩家獲得了一臺(tái)可用服務(wù)器,它將詳細(xì)信息發(fā)回設(shè)備客戶端,以便設(shè)備客戶端直接連接到服務(wù)器。
Matchmaker調(diào)用ACISetSession Azure Functions,以更新玩家被指派連接的容器上運(yùn)行的活動(dòng)會(huì)話數(shù)量。
ACISetSession Function更新Azure表存儲(chǔ)。
到某個(gè)時(shí)刻后,將不再需要服務(wù)器。由于玩家可能仍在使用容器實(shí)例,因此本例不會(huì)手動(dòng)刪除容器,而是調(diào)用ACISetState Azure Functions來將容器的狀態(tài)設(shè)置為MarkedForDeletion,這樣一來,新玩家就不會(huì)被安排到該容器實(shí)例。
ACISetState Azure Functions更新Azure表存儲(chǔ)。
時(shí)間觸發(fā)的ACIGC Azure Functions會(huì)時(shí)不時(shí)地運(yùn)行,并刪除所有具有MarkedForDeletion狀態(tài)的容器實(shí)例。
ACIGC Azure Functions調(diào)用可實(shí)際刪除容器實(shí)例的ACIDelete Azure Functions。
ACIDelete Azure Functions刪除容器。
使用更具體的示例:
一開始沒有服務(wù)器實(shí)例。
突然,玩家需要服務(wù)器進(jìn)行連接,系統(tǒng)調(diào)用了ACICreate。
執(zhí)行創(chuàng)建命令時(shí),服務(wù)器尚未啟動(dòng)和運(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)在需要另一個(gè)服務(wù)器實(shí)例。您可以再次使用ACICreate,或者如果已超出橫向擴(kuò)展閾值,則讓ACIAutoScaler代表您使用ACICreate創(chuàng)建實(shí)例。
還是同樣的模式,新服務(wù)器尚未準(zhǔn)備就緒,當(dāng)部署完成后,事件網(wǎng)格將通過ACIMonitor通知您服務(wù)器在另一個(gè)特定IP地址(即2.3.4.5)中運(yùn)行。系統(tǒng)將這第二個(gè)實(shí)例(容器組2)的狀態(tài)更新為Running。
玩家現(xiàn)在可以連接到第二個(gè)實(shí)例。
最后,不需要第二個(gè)實(shí)例,我們決定不使用它或者超出了擴(kuò)展閾值。由于可能有玩家仍在使用第二個(gè)實(shí)例,因此系統(tǒng)不會(huì)刪除該實(shí)例,而是調(diào)用ACISetScale將服務(wù)器標(biāo)記為刪除,這樣一來,新玩家就不會(huì)被安排到第二個(gè)實(shí)例?,F(xiàn)在,第二個(gè)實(shí)例的狀態(tài)是MarkedForDeletion。
當(dāng)玩家在第二個(gè)實(shí)例中結(jié)束游戲后,系統(tǒng)將運(yùn)行垃圾回收器ACIGB,并觸發(fā)ACIDelete以完全刪除第二個(gè)實(shí)例。
縮放
可通過以下環(huán)境變量配置ACIAutoScaler Azure Functions設(shè)置:擴(kuò)展/收縮閾值、最小/最大實(shí)例數(shù)以及冷卻。下面是自動(dòng)縮放器的邏輯:
計(jì)時(shí)觸發(fā),每隔1分鐘運(yùn)行一次,默認(rèn)禁用。
負(fù)載為已連接的玩家數(shù)量/總玩家容量。
如果(“負(fù)載”>80%且實(shí)例<最大實(shí)例數(shù)),則調(diào)用ACICreate Azure Functions以加快啟動(dòng)新實(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ò)展,只需幾分鐘,您便可以隨時(shí)開始使用新容器。例如,對(duì)于擴(kuò)展30個(gè)運(yùn)行OpenArena的新Azure容器實(shí)例的請(qǐng)求,從請(qǐng)求發(fā)出到玩家能夠連接,用時(shí)不到3分鐘。
手動(dòng)創(chuàng)建一組容器進(jìn)行測(cè)試
如果您想創(chuàng)建一組容器實(shí)例進(jìn)行測(cè)試,可以使用此處提供的示例。將openarenaserver1替換為您要?jiǎng)?chuàng)建的各個(gè)實(shí)例的唯一名稱(如openarenaserver1、openarenaserver2、openarenaserver3等)。您還可以替換資源組、位置和存儲(chǔ)名稱/鍵。
其他資源和示例
請(qǐng)觀看Build上錄制的使用Azure容器實(shí)例實(shí)現(xiàn)多人游戲服務(wù)器縮放視頻,了解詳細(xì)信息。
定價(jià)
如果您沒有Azure訂閱,可以創(chuàng)建免費(fèi)帳戶,開始使用12個(gè)月的免費(fèi)服務(wù)。除非您超出這些服務(wù)的使用限制,否則無需為Azure免費(fèi)帳戶中包含的這些免費(fèi)服務(wù)付費(fèi)。了解如何通過Azure門戶或使用情況文件查看服務(wù)使用情況。
您需要承擔(dān)運(yùn)行這些參考體系結(jié)構(gòu)時(shí)使用的Azure服務(wù)的費(fèi)用,總金額取決于將通過分析管道運(yùn)行的事件數(shù)。請(qǐng)參閱參考體系結(jié)構(gòu)中使用的每項(xiàng)服務(wù)的定價(jià)網(wǎng)頁:
Azure流量管理器
Azure容器實(shí)例
Azure Functions
Azure事件網(wǎng)格
Azure表存儲(chǔ)和Azure Blob存儲(chǔ)
您還可以使用Azure定價(jià)計(jì)算器,以配置和估算您計(jì)劃使用的Azure服務(wù)的成本。