Azure:無服務(wù)器異步多玩家游戲參考體系結(jié)構(gòu)

來源: Microsoft Azure
作者:Microsoft Azure
時間:2021-01-07
16682
Azure Functions-用于運行小塊的匹配邏輯。請注意,使用Consumption計劃時,函數(shù)定義存儲在File Storage中,這意味著您必須創(chuàng)建Storage帳戶。為了獲得最佳性能,您應(yīng)該使用與Functions位于同一區(qū)域的Storage帳戶。

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

multiplayer-async-single.png

體系結(jié)構(gòu)服務(wù)

Azure Functions-用于運行小塊的匹配邏輯。請注意,使用Consumption計劃時,函數(shù)定義存儲在File Storage中,這意味著您必須創(chuàng)建Storage帳戶。為了獲得最佳性能,您應(yīng)該使用與Functions位于同一區(qū)域的Storage帳戶。

Azure Database for MySQL-由于其快速、輕量、可靠且經(jīng)濟高效,用于存儲信息。

通知中心-一種易用的擴展型推送引擎,允許您向多個平臺(iOS、Android、Windows、Kindle、百度等)推送通知。

SignalR-簡化通過HTTP向應(yīng)用程序添加實時網(wǎng)絡(luò)功能的過程,從而讓您將數(shù)據(jù)推送到已連接的設(shè)備客戶端。

Key Vault-用于管理密鑰(包括數(shù)據(jù)庫連接字符串)的最佳服務(wù)。

設(shè)計注意事項

這個參考體系結(jié)構(gòu)展示了一個簡單的無服務(wù)器“井字棋”游戲。

在這個參考體系結(jié)構(gòu)中,一個幫助程序類(數(shù)據(jù)客戶端)將連接到數(shù)據(jù)庫并與之交互,而其余Functions將在需要時使用它。游戲會話類用來根據(jù)玩家提交的信息運行回合,并計算贏家。支持3種不同的操作事件:forfeit(放棄游戲)、addPlayer(將玩家加入游戲會話)和takeTurn

部署模板

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

備注

如果您對ARM模板的工作原理感興趣,請參閱此參考體系結(jié)構(gòu)中使用的每個不同服務(wù)對應(yīng)的Azure資源管理器模板文檔:

使用Azure資源管理器模板創(chuàng)建事件中心

對Azure Functions中的函數(shù)應(yīng)用自動執(zhí)行資源部署

Azure Database for MySQL模板

Azure通知中心模板

Azure SignaR模板

警告

數(shù)據(jù)庫管理員的密碼必須包含8到128個字符。此外,它必須包含以下三種類別的字符:英文大寫字母、英文小寫字母、數(shù)字(0-9)和非字母數(shù)字字符(!、$、#、%等)。

提示

要在本地運行Azure Functions,請使用這些相同的應(yīng)用設(shè)置更新local.settings.json文件。

分步操作

創(chuàng)建新游戲會話

設(shè)備客戶端會格式化玩家選擇的游戲設(shè)置,并將開始游戲會話事件發(fā)送到后端,然后等待響應(yīng)。

后端收到開始新游戲會話的命令。首先,它會嘗試查找與玩家設(shè)置相匹配的現(xiàn)有游戲會話。

如果沒有匹配的合適游戲會話,將創(chuàng)建一個新的游戲會話對象。

創(chuàng)建一個新的持久Orchestrator Function。

持久Orchestrator Function將讀取游戲會話對象,并且一直等到至少2個玩家加入此游戲會話為止。

具有與第一個玩家所選設(shè)置相同的另一個玩家將開始游戲會話事件發(fā)送到后端。

后端收到命令并嘗試查找現(xiàn)有游戲。在這種情況下,它將查找之前創(chuàng)建的游戲會話。

持久Orchestrator Function接收addPlayer事件,并在兩個玩家都加入游戲會話后停止等待。

持久Orchestrator Function正式開始匹配,將游戲狀態(tài)設(shè)置為正在進行,并隨機選擇一個玩家以開始游戲。簡而言之,Orchestrator負責(zé)執(zhí)行游戲邏輯和更新游戲狀態(tài)。

持久Orchestrator Function觸發(fā)一個操作以將數(shù)據(jù)保存到數(shù)據(jù)庫中。它利用數(shù)據(jù)客戶端幫助程序類來連接到數(shù)據(jù)庫,以保存數(shù)據(jù)。

持久Orchestrator Function運行游戲會話邏輯,并返回“輪到下一個玩家開始”。

它根據(jù)游戲條件將排隊通知發(fā)送給一個玩家或多個玩家(輪到別的玩家、有玩家勝出、有玩家棄權(quán),等)。

持久Orchestrator隨后自行調(diào)用新游戲狀態(tài),并等待接收下一個事件。

設(shè)備客戶端收到通知,包括管理游戲會話的Orchestrator Function的唯一標(biāo)識符。

設(shè)備客戶端將加載游戲會話事件發(fā)送到后端,包括在通知中收到的持久Orchestrator的唯一標(biāo)識符。

后端收到加載游戲會話的命令,并返回要由設(shè)備客戶端顯示的游戲會話的詳細信息。

玩家將一個X或O直接提交到持久Orchestrator Function,這一輪結(jié)束。

請求玩家游戲列表

設(shè)備客戶端向后端提交獲取會話列表命令。

后端通過查詢數(shù)據(jù)庫來處理該請求,然后將數(shù)據(jù)發(fā)送到設(shè)備客戶端。請考慮對查詢返回的結(jié)果數(shù)量做出限制并進行排序。

設(shè)備客戶端收到后端響應(yīng),使用它所包含的數(shù)據(jù)來填充相關(guān)UI。

實現(xiàn)示例

讀者練習(xí)

提供的示例不包含用于標(biāo)注從數(shù)據(jù)庫進行讀取的邏輯,而僅僅是寫入邏輯。請考慮使用緩存保護數(shù)據(jù)庫或擴展數(shù)據(jù)庫,以避免耗盡指向數(shù)據(jù)庫的連接。

安全注意事項

不要將數(shù)據(jù)庫連接字符串硬編碼到Function的源代碼中。但至少應(yīng)充分利用函數(shù)應(yīng)用設(shè)置,或者,若要獲取更高的安全性,請改用密鑰保管庫。有一個指南介紹如何創(chuàng)建密鑰保管庫、如何將托管服務(wù)與函數(shù)標(biāo)識結(jié)合使用,以及如何從函數(shù)中讀取存儲在密鑰保管庫中的機密。

備選方案

這個參考體系結(jié)構(gòu)中使用了Azure Database for MySQL,但可以將它替換為Azure SQL數(shù)據(jù)庫或Azure Database for PostgreSQL。

其他資源和示例

使用持久Function和Azure SignalR服務(wù)的益智答題游戲

multiplayer-async-trivia.png

盡管它不是完全異步的(運行一個20秒的計時器),您可以在此鏈接找到用持久Function和Azure SignalR服務(wù)構(gòu)建的益智答題游戲的實施。問題是從jservice.io檢索的。要查看它的運行情況,請參閱此鏈接。

以下是它的工作原理:

益智答題游戲托管方啟動游戲,按照部署或通過網(wǎng)絡(luò)請求調(diào)用HttpStartSingle Azure Functions。

該Azure Functions啟動TriviaOrchestrator Durable Azure Functions。

玩家加入游戲。運行應(yīng)用的每個玩家的設(shè)備客戶端都從后端檢索Azure SignalR服務(wù)中心詳細信息。后端通過SignalRInfo Azure Functions接收該請求。函數(shù)綁定通過在連接字符串中使用鍵生成一個標(biāo)記,然后將其發(fā)送到設(shè)備客戶端。設(shè)備客戶端設(shè)置要偵聽的來自Azure SignalR服務(wù)的兩個事件:newClue和newGuess。

在后端,TriviaOrchestrator Durable Azure Functions調(diào)用GetAndSendClue Durable Azure Functions。

TriviaOrchestrator Durable Azure Functions將計時器設(shè)置為每隔20秒調(diào)用一次,即玩家必須在這段時間內(nèi)響應(yīng)問題。

GetAndSendClue Durable Activity Azure Functions從jservice.io服務(wù)中拉取一個問題。

然后問題通過Azure SignalR服務(wù)廣播到所有具有目標(biāo)*newClue*的已連接用戶。

玩家收到來自Azure SignalR服務(wù)的問題,并提供他們的答案。

后端通過SubmitGuess Azure Functions接收玩家的響應(yīng)。

此Azure Functions計算玩家提交的答案是否正確。然后,結(jié)果通過Azure SignalR服務(wù)廣播到所有具有目標(biāo)newGuess的已連接用戶。

設(shè)備客戶端收到來自Azure SignalR服務(wù)的響應(yīng),并更新回答正確或回答錯誤的次數(shù)。

立即登錄,閱讀全文
版權(quán)說明:
本文內(nèi)容來自于Microsoft Azure,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個人觀點,不代表快出海對觀點贊同或支持。如有侵權(quán),請聯(lián)系管理員(zzx@kchuhai.com)刪除!
優(yōu)質(zhì)服務(wù)商推薦
更多
掃碼登錄
打開掃一掃, 關(guān)注公眾號后即可登錄/注冊
加載中
二維碼已失效 請重試
刷新
賬號登錄/注冊
個人VIP
小程序
快出海小程序
公眾號
快出海公眾號
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家