暢銷視頻游戲《我的世界》和Azure Cosmos DB

來源:微軟中國MSDN
作者:微軟中國MSDN
時間:2020-07-24
2183
盡管Azure Cosmos DB只是支持Minecraft地球的幾個Azure服務之一,但它起著關鍵作用。

若評選2020開年第一關鍵字,腦海中冒出的第一反應顯然非“宅”字莫屬:“宅”生活、“宅”文化、“宅”經濟……各種花式宅法讓全員都進入到了:足不出戶也能為社會作貢獻的日子。但是宅的太久你是否會有些無聊?有沒有懷念起以前的戶外時光?又是否和身邊的大小朋友們一起發(fā)出過“世界那么大,我想去看看”的吶喊?而現(xiàn)在,如果有一個全新的“世界”擺在你的眼前,告訴你只需要動動大腦和手指就能探索世界,同時還可以隨心建造各種各樣的家園,充分滿足你的想象力和創(chuàng)造力,你是否會開啟這樣一段奇幻玄妙而又美好的探險旅程?

ia_2000000002.jpg

Part-1:將我的世界擴展到現(xiàn)實世界

你可能聽說過游戲Minecraft,即使你沒有親自玩過。這是有史以來最暢銷的視頻游戲之一,自2011年以來已售出超過1.76億份。如今,Minecraft每月有超過1.12億玩家,他們可以發(fā)現(xiàn)和收集原材料、工藝工具,并在游戲的沉浸式、程式化3D世界中構建結構或土方工程。根據游戲模式,玩家還可以對抗由計算機控制的敵人,與其他玩家合作或與之競爭。

2019年5月微軟宣布,即將于2019年12月發(fā)布的、在全球推廣《Minecraft地球》新版本,與之前在Minecraft系列中的游戲不同,新版本通過增強現(xiàn)實(AR)的力量,讓玩家能夠體驗我們現(xiàn)實世界中的Minecraft世界,從而將游戲提升到一個全新的水平。

Minecraft地球的玩家立即熟悉了這種體驗,他們與周圍的世界深度融合。然而,對于微軟Minecraft團隊的開發(fā)人員來說,Minecraft地球的交付——尤其是支持游戲所需的強大后端服務——需要構建一些全新的內容。

Minecraft地球服務開發(fā)團隊的高級軟件工程師Nathan Sosnovske解釋說:

"使用Vanilla Minecraft,雖然您可以托管自己的服務器,但沒有集中的服務權限。Minecraft地球基于集中、權威的服務,這是我們?yōu)镸inecraft特許經營權打造的第一個‘重型’服務?!?/span>

Minecraft地球服務開發(fā)人員在交付所需內容時無疑面臨著諸多挑戰(zhàn),但是微軟Azure Cosmos DB很好地滿足了他們的需求:

技術挑戰(zhàn):避免游戲內延時

為了滿足他們的技術要求,Minecraft地球服務開發(fā)人員基于Azure Cosmos DB實現(xiàn)了事件源模式。

Sosnovske說:"我們最初僅僅考慮使用Azure表存儲來存儲追加的事件日志,但缺少用于讀取和寫入延遲的任何SLA,因此不可行。最終,我們選擇了Azure Cosmos DB,因為它為讀取和寫入提供了10毫秒的SLA,以及分布于全球多地理區(qū)域中的復制服務、全局分發(fā)和多主功能"。

使用事件源模式,Minecraft地球服務不僅存儲數(shù)據的當前狀態(tài),而以“僅追加數(shù)據”的模式,將完整的操作系列數(shù)據——即玩家在游戲中采取的每個操作——存儲在CosmosDB中。寫入CosmosDB成功的通知可以立即返回給客戶端,之后,訂閱該存儲的隊列會執(zhí)行后續(xù)處理,一步將收集的數(shù)據應用到Azure Blob存儲中,維護域狀態(tài)。為了進一步優(yōu)化,Minecraft Earth開發(fā)人員將事件源模式與域驅動設計相結合,其中每個應用域(如清單項、特征配置或成就)都有自己的事件流。

Sosnovske說:"我們基于存儲在僅追加日志中的事件流數(shù)據進行建模,繼而變異處理為一種緩存狀態(tài)的模型,用于驅動各種客戶端視圖。"該緩存狀態(tài)在Azure Blob存儲中保存,Azure Blob存儲速度足夠快,可用于讀取,有助于將Azure Cosmos DB的請求單位成本降至最低。在許多方面,我們使用Azure Cosmos DB所做的,就像構建一個真正具有彈性的寫入緩存"。

下圖顯示了基于Azure Cosmos DB的事件源模式的工作原理:

ia_2000000003.jpg

使用Azure Cosmos DB

在使用Azure Cosmos DB時,開發(fā)人員必須做出一些設計決策:

Azure Cosmos DB API。開發(fā)人員選擇使用Azure Cosmos DB核心(SQL)API,因為它提供了最佳性能和最易用性以及其他所需的功能。

Sosnovske解釋道:"我們正在從頭開始構建系統(tǒng),因此不需要兼容性處理層來幫助我們遷移現(xiàn)有代碼。此外,我們所依賴的一些Azure Cosmos DB功能(如事務批處理TransactionalBatch)僅受核心(SQL)API的支持。作為附加優(yōu)勢,核心(SQL)API非常直觀,因為我們的團隊通常已經熟悉SQL"。

閱讀.NET SDK中的事務批處理介紹以了解更多信息。

分區(qū)鍵。開發(fā)人員最終決定根據“用戶”在Azure Cosmos DB中劃分邏輯分區(qū)。

Sosnovske說:"我們最初使用“用戶+域”對數(shù)據數(shù)據進行邏輯分區(qū)(比如用于清單項或成就),但發(fā)現(xiàn)此細分過于精細,無法充分利用Azure Cosmos DB中的數(shù)據庫事務"。

一致性級別。在Azure Cosmos DB支持的五個一致性級別中,開發(fā)人員選擇了會話一致性,它們結合大量etag檢查,以確保正確寫入數(shù)據。

Sosnovske解釋道:"這取決于我們如何存儲數(shù)據,這些數(shù)據被建模為僅追加日志,其頭文檔用作指向日志尾部的指針。寫入數(shù)據庫涉及讀取頭文檔及其etag,派生N+1日志ID,然后構造事務批處理操作,該操作使用以前讀取的etag覆蓋頭指針,并為日志條目創(chuàng)建新文檔。在日志已寫入的可能性下,etag檢查和嘗試創(chuàng)建已存在的文檔將導致事務失敗。無論是否另一個請求"阻止"我們的寫入,或者我們的請求是否讀取稍微過時的數(shù)據,都會發(fā)生這種情況"。

Part-2:全球分布和多區(qū)域寫入

Minecraft地球服務開發(fā)人員使用Azure Cosmos DB中的一鍵式全球分布功能來實現(xiàn)三個目標:容錯、災難恢復和最小延遲,后者還通過使用Azure Cosmos DB的多主功能來實現(xiàn),以實現(xiàn)多區(qū)域寫入。每個受支持的地理位置至少有兩個服務實例。例如,在北美,Minecraft地球服務在美國西部和美國東部Azure區(qū)域運行,Azure的其他組件用于確定哪些組件更接近用戶并相應地路由流量。

Sosnovske解釋道:"借助Azure在許多全球區(qū)域可用,我們能夠輕松建立全球足跡,確保在全球范圍內獲得低延遲的游戲體驗。也就是說,人們大多在一個地理位置內旅行,這就是為什么我們在每個地理位置中的所有服務實例之間都有多主寫入設置。這并不是說,一個住在舊金山的玩家不能去歐洲邊旅行邊玩Minecraft地球……而是說,我們使用不同的機制,以盡量減少在這種情況下的往返延遲"。

每秒請求單位(RU/秒)消耗

在Azure Cosmos DB中,每秒請求單位(RU/s)是用于保留保證數(shù)據庫吞吐量的"貨幣"。對于Minecraft地球,典型的寫入請求消費者大約10 RU/s,其中包括2-3 RU/s用于僅追加事件日志的后臺處理,該日志由Azure服務總線驅動。

"我們發(fā)現(xiàn),我們的RU/s使用量相當線性擴展;當我們有相應的增加的每秒寫入請求,我們只需要增加容量。起初,我們以為需要更多的吞吐量,但事實證明,有很多的優(yōu)化需要做,"Sosnovske說。我們的原始設計較好地處理了請求量和復雜性,但沒有考慮由于總體數(shù)據量增加導致的系統(tǒng)自動分片(即內部重新執(zhí)行物理分區(qū))的情況。

這是因為分配的RU/s在物理分區(qū)之間平均分布,并且具有最新數(shù)據的物理分區(qū)運行得比其余數(shù)據熱得多。

Sosnovske解釋道:"幸運的是,由于我們的系統(tǒng)被建模為僅追加日志,這些日志被具體化到客戶端的視圖中,所以我們很少直接從Azure Cosmos DB讀取舊數(shù)據。我們的數(shù)據模型非常靈活,使我們能夠在事件被處理到視圖中后將其存檔到冷存儲中,然后使用TTL功能從Azure Cosmos DB中自動刪除它們。

如今,借助該服務的當前體系結構,Sosnovske根本不擔心可擴展性。

Sosnovske說:"在開發(fā)過程中,我們測試了Azure Cosmos DB的可擴展性高達100萬RU/s,并且它毫無問題地提供了吞吐量。

Minecraft地球的首次發(fā)布

Minecraft地球于2019年10月在一個地理區(qū)域上正式發(fā)布,在接下來的幾周內完成了在所有其他地理區(qū)域的全球推廣。對于Minecraft的粉絲們來說,Minecraft地球提供了一種在增強現(xiàn)實世界中體驗他們認識和喜愛的游戲的方式。

對于Sosnovske和所有其他幫助將Minecraft地球帶入生活的開發(fā)人員來說,將有史以來最流行的游戲之一擴展到增強現(xiàn)實領域的機會同樣具有回報。

Sosnovske回憶道:"我們中的許多人是游戲玩家,他們抓住機會成為這一切的一部分。"回顧一下,一切都很順利——我們都對結果非常滿意?!?/span>

使用Azure Cosmos DB的好處

盡管Azure Cosmos DB只是支持Minecraft地球的幾個Azure服務之一,但它起著關鍵作用。

Sosnovske說:"不可能有另一種方式,讓我們不從零開始構建令人難以置信的復雜東西,就能實現(xiàn)我們所做的。Azure Cosmos DB提供了我們需要的所有功能,包括低延遲、全局分發(fā)、多主寫入等。我們要做的就是正確地使用它。

使用Azure Cosmos DB構建Minecraft地球服務的具體優(yōu)勢包括:

易于采用和實施。根據Sosnovske的說法,Azure Cosmos DB很容易被采用。

Sosnovske說:"開始使用Azure Cosmos DB非常簡單,尤其是在.NET生態(tài)系統(tǒng)的上下文中。我們只需安裝Nuget包并將其指向正確的終結點。服務文檔非常全面,理解了SDK的工作原理,我們沒有任何重大問題。

零維護。作為Microsoft Azure的一部分,Azure Cosmos DB是一個完全托管的服務,這意味著Minecraft地球服務團隊中沒有人需要擔心修補服務器、維護備份、數(shù)據中心故障等。

"不必處理日常運營是一個巨大的好處,"Sosnovske說。但是,這實際上是在Azure上構建的好處。

保證低延遲。開發(fā)人員選擇Azure Cosmos DB的一個重要原因是,它為在世界任何地方以任何比例讀取和寫入提供受保障的毫秒級(<10ms)延遲SLA。相比之下,表存儲延遲會更高,沒有受保證的上限限制。

Sosnovske說:"Azure Cosmos DB正在如承諾的那樣交付,因為我們看到讀取的平均延遲為7毫秒。

彈性可擴展性。由于Azure Cosmos DB提供的彈性可擴展性,游戲獲得了順利啟動。

Sosnovske說:"Azure Cosmos在擴展我們的服務方面,從來就不是瓶頸。"自首次發(fā)布以來,我們?yōu)閮?yōu)化性能做了大量工作,但是我們知道這樣做的一個巨大的好處是,我們不會達到任何可伸縮性限制。起初,我們可能為吞吐量支付了更多,但這比擁有無法跟上用戶需求增長的服務要好得多。

一鍵式多區(qū)域分布。對于Azure Cosmos DB,地理分布對于Minecraft地球服務開發(fā)人員來說是一項微不足道的任務。對預配吞吐量(以RU/s表示)的調整同樣簡單,因為Azure Cosmos DB透明地在所有區(qū)域執(zhí)行必要的內部操作,持續(xù)提供唯一的系統(tǒng)映像。

Sosnovske說:"一鍵式多區(qū)域分布是一個巨大的好處。"在啟用多主支持時,我們確實必須更仔細地思考如何對系統(tǒng)進行建模,但工作比自己解決問題要少一些。

合規(guī)。通過在Azure Cosmos DB中使用"生存時間(TTL)",開發(fā)人員可以在短時間內安全地存儲基于位置的游戲數(shù)據,而不必擔心違反合規(guī)性要求,如歐洲通用數(shù)據保護法規(guī)(GDPR)。

Sosnovske解釋道:"它讓我們驅動類似'此玩家應只能在給定時間段內兌換此位置一次'這樣的工作流,之后Azure Cosmos DB會自動清理我們設置的TTL中的數(shù)據。

在總結他在Azure Cosmos DB方面的經驗時,Sosnovske的說法是相當積極的。

"Azure Cosmos DB非??煽浚诨〞r間了解基本概念后易于使用,最重要的是,在編寫代碼時,它是“透明的”。當我團隊中的初級開發(fā)人員處理功能時,他們無需考慮數(shù)據庫或數(shù)據的存儲方式;他們可以簡單地為域編寫代碼,讓它工作。

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