體系結(jié)構(gòu)關(guān)系圖
體系結(jié)構(gòu)服務(wù)
Azure Functions-用于運(yùn)行小塊的匹配邏輯。請(qǐng)注意,使用Consumption計(jì)劃時(shí),函數(shù)定義存儲(chǔ)在File Storage中,這意味著您必須創(chuàng)建Storage帳戶。為了獲得最佳性能,您應(yīng)該使用與Functions位于同一區(qū)域的Storage帳戶。
Azure Database for MySQL-由于其快速、輕量、可靠且經(jīng)濟(jì)高效,用于存儲(chǔ)信息。
通知中心-一種易用的擴(kuò)展型推送引擎,允許您向多個(gè)平臺(tái)(iOS、Android、Windows、Kindle、百度等)推送通知。
SignalR-簡(jiǎn)化通過(guò)HTTP向應(yīng)用程序添加實(shí)時(shí)網(wǎng)絡(luò)功能的過(guò)程,從而讓您將數(shù)據(jù)推送到已連接的設(shè)備客戶端。
Key Vault-用于管理密鑰(包括數(shù)據(jù)庫(kù)連接字符串)的最佳服務(wù)。
設(shè)計(jì)注意事項(xiàng)
這個(gè)參考體系結(jié)構(gòu)展示了一個(gè)簡(jiǎn)單的無(wú)服務(wù)器“井字棋”游戲。
在這個(gè)參考體系結(jié)構(gòu)中,一個(gè)幫助程序類(數(shù)據(jù)客戶端)將連接到數(shù)據(jù)庫(kù)并與之交互,而其余Functions將在需要時(shí)使用它。游戲會(huì)話類用來(lái)根據(jù)玩家提交的信息運(yùn)行回合,并計(jì)算贏家。支持3種不同的操作事件:forfeit(放棄游戲)、addPlayer(將玩家加入游戲會(huì)話)和takeTurn
部署模板
請(qǐng)查看一般指南文檔,其中有一部分概述了Azure服務(wù)的命名規(guī)則和限制。
備注
如果您對(duì)ARM模板的工作原理感興趣,請(qǐng)參閱此參考體系結(jié)構(gòu)中使用的每個(gè)不同服務(wù)對(duì)應(yīng)的Azure資源管理器模板文檔:
使用Azure資源管理器模板創(chuàng)建事件中心
對(duì)Azure Functions中的函數(shù)應(yīng)用自動(dòng)執(zhí)行資源部署
Azure Database for MySQL模板
Azure通知中心模板
Azure SignaR模板
警告
數(shù)據(jù)庫(kù)管理員的密碼必須包含8到128個(gè)字符。此外,它必須包含以下三種類別的字符:英文大寫字母、英文小寫字母、數(shù)字(0-9)和非字母數(shù)字字符(!、$、#、%等)。
提示
要在本地運(yùn)行Azure Functions,請(qǐng)使用這些相同的應(yīng)用設(shè)置更新local.settings.json文件。
分步操作
創(chuàng)建新游戲會(huì)話
設(shè)備客戶端會(huì)格式化玩家選擇的游戲設(shè)置,并將開始游戲會(huì)話事件發(fā)送到后端,然后等待響應(yīng)。
后端收到開始新游戲會(huì)話的命令。首先,它會(huì)嘗試查找與玩家設(shè)置相匹配的現(xiàn)有游戲會(huì)話。
如果沒(méi)有匹配的合適游戲會(huì)話,將創(chuàng)建一個(gè)新的游戲會(huì)話對(duì)象。
創(chuàng)建一個(gè)新的持久Orchestrator Function。
持久Orchestrator Function將讀取游戲會(huì)話對(duì)象,并且一直等到至少2個(gè)玩家加入此游戲會(huì)話為止。
具有與第一個(gè)玩家所選設(shè)置相同的另一個(gè)玩家將開始游戲會(huì)話事件發(fā)送到后端。
后端收到命令并嘗試查找現(xiàn)有游戲。在這種情況下,它將查找之前創(chuàng)建的游戲會(huì)話。
持久Orchestrator Function接收addPlayer事件,并在兩個(gè)玩家都加入游戲會(huì)話后停止等待。
持久Orchestrator Function正式開始匹配,將游戲狀態(tài)設(shè)置為正在進(jìn)行,并隨機(jī)選擇一個(gè)玩家以開始游戲。簡(jiǎn)而言之,Orchestrator負(fù)責(zé)執(zhí)行游戲邏輯和更新游戲狀態(tài)。
持久Orchestrator Function觸發(fā)一個(gè)操作以將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。它利用數(shù)據(jù)客戶端幫助程序類來(lái)連接到數(shù)據(jù)庫(kù),以保存數(shù)據(jù)。
持久Orchestrator Function運(yùn)行游戲會(huì)話邏輯,并返回“輪到下一個(gè)玩家開始”。
它根據(jù)游戲條件將排隊(duì)通知發(fā)送給一個(gè)玩家或多個(gè)玩家(輪到別的玩家、有玩家勝出、有玩家棄權(quán),等)。
持久Orchestrator隨后自行調(diào)用新游戲狀態(tài),并等待接收下一個(gè)事件。
設(shè)備客戶端收到通知,包括管理游戲會(huì)話的Orchestrator Function的唯一標(biāo)識(shí)符。
設(shè)備客戶端將加載游戲會(huì)話事件發(fā)送到后端,包括在通知中收到的持久Orchestrator的唯一標(biāo)識(shí)符。
后端收到加載游戲會(huì)話的命令,并返回要由設(shè)備客戶端顯示的游戲會(huì)話的詳細(xì)信息。
玩家將一個(gè)X或O直接提交到持久Orchestrator Function,這一輪結(jié)束。
請(qǐng)求玩家游戲列表
設(shè)備客戶端向后端提交獲取會(huì)話列表命令。
后端通過(guò)查詢數(shù)據(jù)庫(kù)來(lái)處理該請(qǐng)求,然后將數(shù)據(jù)發(fā)送到設(shè)備客戶端。請(qǐng)考慮對(duì)查詢返回的結(jié)果數(shù)量做出限制并進(jìn)行排序。
設(shè)備客戶端收到后端響應(yīng),使用它所包含的數(shù)據(jù)來(lái)填充相關(guān)UI。
實(shí)現(xiàn)示例
讀者練習(xí)
提供的示例不包含用于標(biāo)注從數(shù)據(jù)庫(kù)進(jìn)行讀取的邏輯,而僅僅是寫入邏輯。請(qǐng)考慮使用緩存保護(hù)數(shù)據(jù)庫(kù)或擴(kuò)展數(shù)據(jù)庫(kù),以避免耗盡指向數(shù)據(jù)庫(kù)的連接。
安全注意事項(xiàng)
不要將數(shù)據(jù)庫(kù)連接字符串硬編碼到Function的源代碼中。但至少應(yīng)充分利用函數(shù)應(yīng)用設(shè)置,或者,若要獲取更高的安全性,請(qǐng)改用密鑰保管庫(kù)。有一個(gè)指南介紹如何創(chuàng)建密鑰保管庫(kù)、如何將托管服務(wù)與函數(shù)標(biāo)識(shí)結(jié)合使用,以及如何從函數(shù)中讀取存儲(chǔ)在密鑰保管庫(kù)中的機(jī)密。
備選方案
這個(gè)參考體系結(jié)構(gòu)中使用了Azure Database for MySQL,但可以將它替換為Azure SQL數(shù)據(jù)庫(kù)或Azure Database for PostgreSQL。
其他資源和示例
使用持久Function和Azure SignalR服務(wù)的益智答題游戲
盡管它不是完全異步的(運(yùn)行一個(gè)20秒的計(jì)時(shí)器),您可以在此鏈接找到用持久Function和Azure SignalR服務(wù)構(gòu)建的益智答題游戲的實(shí)施。問(wèn)題是從jservice.io檢索的。要查看它的運(yùn)行情況,請(qǐng)參閱此鏈接。
以下是它的工作原理:
益智答題游戲托管方啟動(dòng)游戲,按照部署或通過(guò)網(wǎng)絡(luò)請(qǐng)求調(diào)用HttpStartSingle Azure Functions。
該Azure Functions啟動(dòng)TriviaOrchestrator Durable Azure Functions。
玩家加入游戲。運(yùn)行應(yīng)用的每個(gè)玩家的設(shè)備客戶端都從后端檢索Azure SignalR服務(wù)中心詳細(xì)信息。后端通過(guò)SignalRInfo Azure Functions接收該請(qǐng)求。函數(shù)綁定通過(guò)在連接字符串中使用鍵生成一個(gè)標(biāo)記,然后將其發(fā)送到設(shè)備客戶端。設(shè)備客戶端設(shè)置要偵聽的來(lái)自Azure SignalR服務(wù)的兩個(gè)事件:newClue和newGuess。
在后端,TriviaOrchestrator Durable Azure Functions調(diào)用GetAndSendClue Durable Azure Functions。
TriviaOrchestrator Durable Azure Functions將計(jì)時(shí)器設(shè)置為每隔20秒調(diào)用一次,即玩家必須在這段時(shí)間內(nèi)響應(yīng)問(wèn)題。
GetAndSendClue Durable Activity Azure Functions從jservice.io服務(wù)中拉取一個(gè)問(wèn)題。
然后問(wèn)題通過(guò)Azure SignalR服務(wù)廣播到所有具有目標(biāo)*newClue*的已連接用戶。
玩家收到來(lái)自Azure SignalR服務(wù)的問(wèn)題,并提供他們的答案。
后端通過(guò)SubmitGuess Azure Functions接收玩家的響應(yīng)。
此Azure Functions計(jì)算玩家提交的答案是否正確。然后,結(jié)果通過(guò)Azure SignalR服務(wù)廣播到所有具有目標(biāo)newGuess的已連接用戶。
設(shè)備客戶端收到來(lái)自Azure SignalR服務(wù)的響應(yīng),并更新回答正確或回答錯(cuò)誤的次數(shù)。