若評(píng)選2020開(kāi)年第一關(guān)鍵字,腦海中冒出的第一反應(yīng)顯然非“宅”字莫屬:“宅”生活、“宅”文化、“宅”經(jīng)濟(jì)……各種花式宅法讓全員都進(jìn)入到了:足不出戶也能為社會(huì)作貢獻(xiàn)的日子。但是宅的太久你是否會(huì)有些無(wú)聊?有沒(méi)有懷念起以前的戶外時(shí)光?又是否和身邊的大小朋友們一起發(fā)出過(guò)“世界那么大,我想去看看”的吶喊?而現(xiàn)在,如果有一個(gè)全新的“世界”擺在你的眼前,告訴你只需要?jiǎng)觿?dòng)大腦和手指就能探索世界,同時(shí)還可以隨心建造各種各樣的家園,充分滿足你的想象力和創(chuàng)造力,你是否會(huì)開(kāi)啟這樣一段奇幻玄妙而又美好的探險(xiǎn)旅程?
Part-1:將我的世界擴(kuò)展到現(xiàn)實(shí)世界
你可能聽(tīng)說(shuō)過(guò)游戲Minecraft,即使你沒(méi)有親自玩過(guò)。這是有史以來(lái)最暢銷的視頻游戲之一,自2011年以來(lái)已售出超過(guò)1.76億份。如今,Minecraft每月有超過(guò)1.12億玩家,他們可以發(fā)現(xiàn)和收集原材料、工藝工具,并在游戲的沉浸式、程式化3D世界中構(gòu)建結(jié)構(gòu)或土方工程。根據(jù)游戲模式,玩家還可以對(duì)抗由計(jì)算機(jī)控制的敵人,與其他玩家合作或與之競(jìng)爭(zhēng)。
2019年5月微軟宣布,即將于2019年12月發(fā)布的、在全球推廣《Minecraft地球》新版本,與之前在Minecraft系列中的游戲不同,新版本通過(guò)增強(qiáng)現(xiàn)實(shí)(AR)的力量,讓玩家能夠體驗(yàn)我們現(xiàn)實(shí)世界中的Minecraft世界,從而將游戲提升到一個(gè)全新的水平。
Minecraft地球的玩家立即熟悉了這種體驗(yàn),他們與周圍的世界深度融合。然而,對(duì)于微軟Minecraft團(tuán)隊(duì)的開(kāi)發(fā)人員來(lái)說(shuō),Minecraft地球的交付——尤其是支持游戲所需的強(qiáng)大后端服務(wù)——需要構(gòu)建一些全新的內(nèi)容。
Minecraft地球服務(wù)開(kāi)發(fā)團(tuán)隊(duì)的高級(jí)軟件工程師Nathan Sosnovske解釋說(shuō):
"使用Vanilla Minecraft,雖然您可以托管自己的服務(wù)器,但沒(méi)有集中的服務(wù)權(quán)限。Minecraft地球基于集中、權(quán)威的服務(wù),這是我們?yōu)镸inecraft特許經(jīng)營(yíng)權(quán)打造的第一個(gè)‘重型’服務(wù)?!?/span>
Minecraft地球服務(wù)開(kāi)發(fā)人員在交付所需內(nèi)容時(shí)無(wú)疑面臨著諸多挑戰(zhàn),但是微軟Azure Cosmos DB很好地滿足了他們的需求:
技術(shù)挑戰(zhàn):避免游戲內(nèi)延時(shí)
為了滿足他們的技術(shù)要求,Minecraft地球服務(wù)開(kāi)發(fā)人員基于Azure Cosmos DB實(shí)現(xiàn)了事件源模式。
Sosnovske說(shuō):"我們最初僅僅考慮使用Azure表存儲(chǔ)來(lái)存儲(chǔ)追加的事件日志,但缺少用于讀取和寫入延遲的任何SLA,因此不可行。最終,我們選擇了Azure Cosmos DB,因?yàn)樗鼮樽x取和寫入提供了10毫秒的SLA,以及分布于全球多地理區(qū)域中的復(fù)制服務(wù)、全局分發(fā)和多主功能"。
使用事件源模式,Minecraft地球服務(wù)不僅存儲(chǔ)數(shù)據(jù)的當(dāng)前狀態(tài),而以“僅追加數(shù)據(jù)”的模式,將完整的操作系列數(shù)據(jù)——即玩家在游戲中采取的每個(gè)操作——存儲(chǔ)在CosmosDB中。寫入CosmosDB成功的通知可以立即返回給客戶端,之后,訂閱該存儲(chǔ)的隊(duì)列會(huì)執(zhí)行后續(xù)處理,一步將收集的數(shù)據(jù)應(yīng)用到Azure Blob存儲(chǔ)中,維護(hù)域狀態(tài)。為了進(jìn)一步優(yōu)化,Minecraft Earth開(kāi)發(fā)人員將事件源模式與域驅(qū)動(dòng)設(shè)計(jì)相結(jié)合,其中每個(gè)應(yīng)用域(如清單項(xiàng)、特征配置或成就)都有自己的事件流。
Sosnovske說(shuō):"我們基于存儲(chǔ)在僅追加日志中的事件流數(shù)據(jù)進(jìn)行建模,繼而變異處理為一種緩存狀態(tài)的模型,用于驅(qū)動(dòng)各種客戶端視圖。"該緩存狀態(tài)在Azure Blob存儲(chǔ)中保存,Azure Blob存儲(chǔ)速度足夠快,可用于讀取,有助于將Azure Cosmos DB的請(qǐng)求單位成本降至最低。在許多方面,我們使用Azure Cosmos DB所做的,就像構(gòu)建一個(gè)真正具有彈性的寫入緩存"。
下圖顯示了基于Azure Cosmos DB的事件源模式的工作原理:
使用Azure Cosmos DB
在使用Azure Cosmos DB時(shí),開(kāi)發(fā)人員必須做出一些設(shè)計(jì)決策:
Azure Cosmos DB API。開(kāi)發(fā)人員選擇使用Azure Cosmos DB核心(SQL)API,因?yàn)樗峁┝俗罴研阅芎妥钜子眯砸约捌渌璧墓δ堋?/span>
Sosnovske解釋道:"我們正在從頭開(kāi)始構(gòu)建系統(tǒng),因此不需要兼容性處理層來(lái)幫助我們遷移現(xiàn)有代碼。此外,我們所依賴的一些Azure Cosmos DB功能(如事務(wù)批處理TransactionalBatch)僅受核心(SQL)API的支持。作為附加優(yōu)勢(shì),核心(SQL)API非常直觀,因?yàn)槲覀兊膱F(tuán)隊(duì)通常已經(jīng)熟悉SQL"。
閱讀.NET SDK中的事務(wù)批處理介紹以了解更多信息。
分區(qū)鍵。開(kāi)發(fā)人員最終決定根據(jù)“用戶”在Azure Cosmos DB中劃分邏輯分區(qū)。
Sosnovske說(shuō):"我們最初使用“用戶+域”對(duì)數(shù)據(jù)數(shù)據(jù)進(jìn)行邏輯分區(qū)(比如用于清單項(xiàng)或成就),但發(fā)現(xiàn)此細(xì)分過(guò)于精細(xì),無(wú)法充分利用Azure Cosmos DB中的數(shù)據(jù)庫(kù)事務(wù)"。
一致性級(jí)別。在Azure Cosmos DB支持的五個(gè)一致性級(jí)別中,開(kāi)發(fā)人員選擇了會(huì)話一致性,它們結(jié)合大量etag檢查,以確保正確寫入數(shù)據(jù)。
Sosnovske解釋道:"這取決于我們?nèi)绾未鎯?chǔ)數(shù)據(jù),這些數(shù)據(jù)被建模為僅追加日志,其頭文檔用作指向日志尾部的指針。寫入數(shù)據(jù)庫(kù)涉及讀取頭文檔及其etag,派生N+1日志ID,然后構(gòu)造事務(wù)批處理操作,該操作使用以前讀取的etag覆蓋頭指針,并為日志條目創(chuàng)建新文檔。在日志已寫入的可能性下,etag檢查和嘗試創(chuàng)建已存在的文檔將導(dǎo)致事務(wù)失敗。無(wú)論是否另一個(gè)請(qǐng)求"阻止"我們的寫入,或者我們的請(qǐng)求是否讀取稍微過(guò)時(shí)的數(shù)據(jù),都會(huì)發(fā)生這種情況"。
Part-2:全球分布和多區(qū)域?qū)懭?/span>
Minecraft地球服務(wù)開(kāi)發(fā)人員使用Azure Cosmos DB中的一鍵式全球分布功能來(lái)實(shí)現(xiàn)三個(gè)目標(biāo):容錯(cuò)、災(zāi)難恢復(fù)和最小延遲,后者還通過(guò)使用Azure Cosmos DB的多主功能來(lái)實(shí)現(xiàn),以實(shí)現(xiàn)多區(qū)域?qū)懭搿C總€(gè)受支持的地理位置至少有兩個(gè)服務(wù)實(shí)例。例如,在北美,Minecraft地球服務(wù)在美國(guó)西部和美國(guó)東部Azure區(qū)域運(yùn)行,Azure的其他組件用于確定哪些組件更接近用戶并相應(yīng)地路由流量。
Sosnovske解釋道:"借助Azure在許多全球區(qū)域可用,我們能夠輕松建立全球足跡,確保在全球范圍內(nèi)獲得低延遲的游戲體驗(yàn)。也就是說(shuō),人們大多在一個(gè)地理位置內(nèi)旅行,這就是為什么我們?cè)诿總€(gè)地理位置中的所有服務(wù)實(shí)例之間都有多主寫入設(shè)置。這并不是說(shuō),一個(gè)住在舊金山的玩家不能去歐洲邊旅行邊玩Minecraft地球……而是說(shuō),我們使用不同的機(jī)制,以盡量減少在這種情況下的往返延遲"。
每秒請(qǐng)求單位(RU/秒)消耗
在Azure Cosmos DB中,每秒請(qǐng)求單位(RU/s)是用于保留保證數(shù)據(jù)庫(kù)吞吐量的"貨幣"。對(duì)于Minecraft地球,典型的寫入請(qǐng)求消費(fèi)者大約10 RU/s,其中包括2-3 RU/s用于僅追加事件日志的后臺(tái)處理,該日志由Azure服務(wù)總線驅(qū)動(dòng)。
"我們發(fā)現(xiàn),我們的RU/s使用量相當(dāng)線性擴(kuò)展;當(dāng)我們有相應(yīng)的增加的每秒寫入請(qǐng)求,我們只需要增加容量。起初,我們以為需要更多的吞吐量,但事實(shí)證明,有很多的優(yōu)化需要做,"Sosnovske說(shuō)。我們的原始設(shè)計(jì)較好地處理了請(qǐng)求量和復(fù)雜性,但沒(méi)有考慮由于總體數(shù)據(jù)量增加導(dǎo)致的系統(tǒng)自動(dòng)分片(即內(nèi)部重新執(zhí)行物理分區(qū))的情況。
這是因?yàn)榉峙涞腞U/s在物理分區(qū)之間平均分布,并且具有最新數(shù)據(jù)的物理分區(qū)運(yùn)行得比其余數(shù)據(jù)熱得多。
Sosnovske解釋道:"幸運(yùn)的是,由于我們的系統(tǒng)被建模為僅追加日志,這些日志被具體化到客戶端的視圖中,所以我們很少直接從Azure Cosmos DB讀取舊數(shù)據(jù)。我們的數(shù)據(jù)模型非常靈活,使我們能夠在事件被處理到視圖中后將其存檔到冷存儲(chǔ)中,然后使用TTL功能從Azure Cosmos DB中自動(dòng)刪除它們。
如今,借助該服務(wù)的當(dāng)前體系結(jié)構(gòu),Sosnovske根本不擔(dān)心可擴(kuò)展性。
Sosnovske說(shuō):"在開(kāi)發(fā)過(guò)程中,我們測(cè)試了Azure Cosmos DB的可擴(kuò)展性高達(dá)100萬(wàn)RU/s,并且它毫無(wú)問(wèn)題地提供了吞吐量。
Minecraft地球的首次發(fā)布
Minecraft地球于2019年10月在一個(gè)地理區(qū)域上正式發(fā)布,在接下來(lái)的幾周內(nèi)完成了在所有其他地理區(qū)域的全球推廣。對(duì)于Minecraft的粉絲們來(lái)說(shuō),Minecraft地球提供了一種在增強(qiáng)現(xiàn)實(shí)世界中體驗(yàn)他們認(rèn)識(shí)和喜愛(ài)的游戲的方式。
對(duì)于Sosnovske和所有其他幫助將Minecraft地球帶入生活的開(kāi)發(fā)人員來(lái)說(shuō),將有史以來(lái)最流行的游戲之一擴(kuò)展到增強(qiáng)現(xiàn)實(shí)領(lǐng)域的機(jī)會(huì)同樣具有回報(bào)。
Sosnovske回憶道:"我們中的許多人是游戲玩家,他們抓住機(jī)會(huì)成為這一切的一部分。"回顧一下,一切都很順利——我們都對(duì)結(jié)果非常滿意。“
使用Azure Cosmos DB的好處
盡管Azure Cosmos DB只是支持Minecraft地球的幾個(gè)Azure服務(wù)之一,但它起著關(guān)鍵作用。
Sosnovske說(shuō):"不可能有另一種方式,讓我們不從零開(kāi)始構(gòu)建令人難以置信的復(fù)雜東西,就能實(shí)現(xiàn)我們所做的。Azure Cosmos DB提供了我們需要的所有功能,包括低延遲、全局分發(fā)、多主寫入等。我們要做的就是正確地使用它。
使用Azure Cosmos DB構(gòu)建Minecraft地球服務(wù)的具體優(yōu)勢(shì)包括:
易于采用和實(shí)施。根據(jù)Sosnovske的說(shuō)法,Azure Cosmos DB很容易被采用。
Sosnovske說(shuō):"開(kāi)始使用Azure Cosmos DB非常簡(jiǎn)單,尤其是在.NET生態(tài)系統(tǒng)的上下文中。我們只需安裝Nuget包并將其指向正確的終結(jié)點(diǎn)。服務(wù)文檔非常全面,理解了SDK的工作原理,我們沒(méi)有任何重大問(wèn)題。
零維護(hù)。作為Microsoft Azure的一部分,Azure Cosmos DB是一個(gè)完全托管的服務(wù),這意味著Minecraft地球服務(wù)團(tuán)隊(duì)中沒(méi)有人需要擔(dān)心修補(bǔ)服務(wù)器、維護(hù)備份、數(shù)據(jù)中心故障等。
"不必處理日常運(yùn)營(yíng)是一個(gè)巨大的好處,"Sosnovske說(shuō)。但是,這實(shí)際上是在Azure上構(gòu)建的好處。
保證低延遲。開(kāi)發(fā)人員選擇Azure Cosmos DB的一個(gè)重要原因是,它為在世界任何地方以任何比例讀取和寫入提供受保障的毫秒級(jí)(<10ms)延遲SLA。相比之下,表存儲(chǔ)延遲會(huì)更高,沒(méi)有受保證的上限限制。
Sosnovske說(shuō):"Azure Cosmos DB正在如承諾的那樣交付,因?yàn)槲覀兛吹阶x取的平均延遲為7毫秒。
彈性可擴(kuò)展性。由于Azure Cosmos DB提供的彈性可擴(kuò)展性,游戲獲得了順利啟動(dòng)。
Sosnovske說(shuō):"Azure Cosmos在擴(kuò)展我們的服務(wù)方面,從來(lái)就不是瓶頸。"自首次發(fā)布以來(lái),我們?yōu)閮?yōu)化性能做了大量工作,但是我們知道這樣做的一個(gè)巨大的好處是,我們不會(huì)達(dá)到任何可伸縮性限制。起初,我們可能為吞吐量支付了更多,但這比擁有無(wú)法跟上用戶需求增長(zhǎng)的服務(wù)要好得多。
一鍵式多區(qū)域分布。對(duì)于Azure Cosmos DB,地理分布對(duì)于Minecraft地球服務(wù)開(kāi)發(fā)人員來(lái)說(shuō)是一項(xiàng)微不足道的任務(wù)。對(duì)預(yù)配吞吐量(以RU/s表示)的調(diào)整同樣簡(jiǎn)單,因?yàn)锳zure Cosmos DB透明地在所有區(qū)域執(zhí)行必要的內(nèi)部操作,持續(xù)提供唯一的系統(tǒng)映像。
Sosnovske說(shuō):"一鍵式多區(qū)域分布是一個(gè)巨大的好處。"在啟用多主支持時(shí),我們確實(shí)必須更仔細(xì)地思考如何對(duì)系統(tǒng)進(jìn)行建模,但工作比自己解決問(wèn)題要少一些。
合規(guī)。通過(guò)在Azure Cosmos DB中使用"生存時(shí)間(TTL)",開(kāi)發(fā)人員可以在短時(shí)間內(nèi)安全地存儲(chǔ)基于位置的游戲數(shù)據(jù),而不必?fù)?dān)心違反合規(guī)性要求,如歐洲通用數(shù)據(jù)保護(hù)法規(guī)(GDPR)。
Sosnovske解釋道:"它讓我們驅(qū)動(dòng)類似'此玩家應(yīng)只能在給定時(shí)間段內(nèi)兌換此位置一次'這樣的工作流,之后Azure Cosmos DB會(huì)自動(dòng)清理我們?cè)O(shè)置的TTL中的數(shù)據(jù)。
在總結(jié)他在Azure Cosmos DB方面的經(jīng)驗(yàn)時(shí),Sosnovske的說(shuō)法是相當(dāng)積極的。
"Azure Cosmos DB非??煽?,在花時(shí)間了解基本概念后易于使用,最重要的是,在編寫代碼時(shí),它是“透明的”。當(dāng)我團(tuán)隊(duì)中的初級(jí)開(kāi)發(fā)人員處理功能時(shí),他們無(wú)需考慮數(shù)據(jù)庫(kù)或數(shù)據(jù)的存儲(chǔ)方式;他們可以簡(jiǎn)單地為域編寫代碼,讓它工作。