
若评选2020开年第一关键字,脑海中冒出的第一反应显然非“宅”字莫属:“宅”生活、“宅”文化、“宅”经济……各种花式宅法让全员都进入到了:足不出户也能为社会作贡献的日子。但是宅的太久你是否会有些无聊?有没有怀念起以前的户外时光?又是否和身边的大小朋友们一起发出过“世界那么大,我想去看看”的呐喊?而现在,如果有一个全新的“世界”摆在你的眼前,告诉你只需要动动大脑和手指就能探索世界,同时还可以随心建造各种各样的家园,充分满足你的想象力和创造力,你是否会开启这样一段奇幻玄妙而又美好的探险旅程?
Part-1:将我的世界扩展到现实世界
你可能听说过游戏Minecraft,即使你没有亲自玩过。这是有史以来最畅销的视频游戏之一,自2011年以来已售出超过1.76亿份。如今,Minecraft每月有超过1.12亿玩家,他们可以发现和收集原材料、工艺工具,并在游戏的沉浸式、程式化3D世界中构建结构或土方工程。根据游戏模式,玩家还可以对抗由计算机控制的敌人,与其他玩家合作或与之竞争。
2019年5月微软宣布,即将于2019年12月发布的、在全球推广《Minecraft地球》新版本,与之前在Minecraft系列中的游戏不同,新版本通过增强现实(AR)的力量,让玩家能够体验我们现实世界中的Minecraft世界,从而将游戏提升到一个全新的水平。
Minecraft地球的玩家立即熟悉了这种体验,他们与周围的世界深度融合。然而,对于微软Minecraft团队的开发人员来说,Minecraft地球的交付——尤其是支持游戏所需的强大后端服务——需要构建一些全新的内容。
Minecraft地球服务开发团队的高级软件工程师Nathan Sosnovske解释说:
“使用Vanilla Minecraft,虽然您可以托管自己的服务器,但没有集中的服务权限。Minecraft地球基于集中、权威的服务,这是我们为Minecraft特许经营权打造的第一个‘重型’服务。“
Minecraft地球服务开发人员在交付所需内容时无疑面临着诸多挑战,但是微软Azure Cosmos DB很好地满足了他们的需求:
技术挑战:避免游戏内延时
为了满足他们的技术要求,Minecraft地球服务开发人员基于Azure Cosmos DB实现了事件源模式。
Sosnovske说:”我们最初仅仅考虑使用Azure表存储来存储追加的事件日志,但缺少用于读取和写入延迟的任何SLA,因此不可行。最终,我们选择了Azure Cosmos DB,因为它为读取和写入提供了10毫秒的SLA,以及分布于全球多地理区域中的复制服务、全局分发和多主功能”。
使用事件源模式,Minecraft地球服务不仅存储数据的当前状态,而以“仅追加数据”的模式,将完整的操作系列数据——即玩家在游戏中采取的每个操作——存储在CosmosDB中。写入CosmosDB成功的通知可以立即返回给客户端,之后,订阅该存储的队列会执行后续处理,一步将收集的数据应用到Azure Blob存储中,维护域状态。为了进一步优化,Minecraft Earth开发人员将事件源模式与域驱动设计相结合,其中每个应用域(如清单项、特征配置或成就)都有自己的事件流。
Sosnovske说:”我们基于存储在仅追加日志中的事件流数据进行建模,继而变异处理为一种缓存状态的模型,用于驱动各种客户端视图。”该缓存状态在Azure Blob存储中保存,Azure Blob存储速度足够快,可用于读取,有助于将Azure Cosmos DB的请求单位成本降至最低。在许多方面,我们使用Azure Cosmos DB所做的,就像构建一个真正具有弹性的写入缓存”。
下图显示了基于Azure Cosmos DB的事件源模式的工作原理:
使用Azure Cosmos DB
在使用Azure Cosmos DB时,开发人员必须做出一些设计决策:
Azure Cosmos DB API。开发人员选择使用Azure Cosmos DB核心(SQL)API,因为它提供了最佳性能和最易用性以及其他所需的功能。
Sosnovske解释道:”我们正在从头开始构建系统,因此不需要兼容性处理层来帮助我们迁移现有代码。此外,我们所依赖的一些Azure Cosmos DB功能(如事务批处理TransactionalBatch)仅受核心(SQL)API的支持。作为附加优势,核心(SQL)API非常直观,因为我们的团队通常已经熟悉SQL”。
阅读.NET SDK中的事务批处理介绍以了解更多信息。
分区键。开发人员最终决定根据“用户”在Azure Cosmos DB中划分逻辑分区。
Sosnovske说:”我们最初使用“用户+域”对数据数据进行逻辑分区(比如用于清单项或成就),但发现此细分过于精细,无法充分利用Azure Cosmos DB中的数据库事务”。
一致性级别。在Azure Cosmos DB支持的五个一致性级别中,开发人员选择了会话一致性,它们结合大量etag检查,以确保正确写入数据。
Sosnovske解释道:”这取决于我们如何存储数据,这些数据被建模为仅追加日志,其头文档用作指向日志尾部的指针。写入数据库涉及读取头文档及其etag,派生N+1日志ID,然后构造事务批处理操作,该操作使用以前读取的etag覆盖头指针,并为日志条目创建新文档。在日志已写入的可能性下,etag检查和尝试创建已存在的文档将导致事务失败。无论是否另一个请求”阻止”我们的写入,或者我们的请求是否读取稍微过时的数据,都会发生这种情况”。
Part-2:全球分布和多区域写入
Minecraft地球服务开发人员使用Azure Cosmos DB中的一键式全球分布功能来实现三个目标:容错、灾难恢复和最小延迟,后者还通过使用Azure Cosmos DB的多主功能来实现,以实现多区域写入。每个受支持的地理位置至少有两个服务实例。例如,在北美,Minecraft地球服务在美国西部和美国东部Azure区域运行,Azure的其他组件用于确定哪些组件更接近用户并相应地路由流量。
Sosnovske解释道:”借助Azure在许多全球区域可用,我们能够轻松建立全球足迹,确保在全球范围内获得低延迟的游戏体验。也就是说,人们大多在一个地理位置内旅行,这就是为什么我们在每个地理位置中的所有服务实例之间都有多主写入设置。这并不是说,一个住在旧金山的玩家不能去欧洲边旅行边玩Minecraft地球……而是说,我们使用不同的机制,以尽量减少在这种情况下的往返延迟”。
每秒请求单位(RU/秒)消耗
在Azure Cosmos DB中,每秒请求单位(RU/s)是用于保留保证数据库吞吐量的”货币”。对于Minecraft地球,典型的写入请求消费者大约10 RU/s,其中包括2-3 RU/s用于仅追加事件日志的后台处理,该日志由Azure服务总线驱动。
“我们发现,我们的RU/s使用量相当线性扩展;当我们有相应的增加的每秒写入请求,我们只需要增加容量。起初,我们以为需要更多的吞吐量,但事实证明,有很多的优化需要做,”Sosnovske说。我们的原始设计较好地处理了请求量和复杂性,但没有考虑由于总体数据量增加导致的系统自动分片(即内部重新执行物理分区)的情况。
这是因为分配的RU/s在物理分区之间平均分布,并且具有最新数据的物理分区运行得比其余数据热得多。
Sosnovske解释道:”幸运的是,由于我们的系统被建模为仅追加日志,这些日志被具体化到客户端的视图中,所以我们很少直接从Azure Cosmos DB读取旧数据。我们的数据模型非常灵活,使我们能够在事件被处理到视图中后将其存档到冷存储中,然后使用TTL功能从Azure Cosmos DB中自动删除它们。
如今,借助该服务的当前体系结构,Sosnovske根本不担心可扩展性。
Sosnovske说:”在开发过程中,我们测试了Azure Cosmos DB的可扩展性高达100万RU/s,并且它毫无问题地提供了吞吐量。
Minecraft地球的首次发布
Minecraft地球于2019年10月在一个地理区域上正式发布,在接下来的几周内完成了在所有其他地理区域的全球推广。对于Minecraft的粉丝们来说,Minecraft地球提供了一种在增强现实世界中体验他们认识和喜爱的游戏的方式。
对于Sosnovske和所有其他帮助将Minecraft地球带入生活的开发人员来说,将有史以来最流行的游戏之一扩展到增强现实领域的机会同样具有回报。
Sosnovske回忆道:”我们中的许多人是游戏玩家,他们抓住机会成为这一切的一部分。”回顾一下,一切都很顺利——我们都对结果非常满意。“
使用Azure Cosmos DB的好处
尽管Azure Cosmos DB只是支持Minecraft地球的几个Azure服务之一,但它起着关键作用。
Sosnovske说:”不可能有另一种方式,让我们不从零开始构建令人难以置信的复杂东西,就能实现我们所做的。Azure Cosmos DB提供了我们需要的所有功能,包括低延迟、全局分发、多主写入等。我们要做的就是正确地使用它。
使用Azure Cosmos DB构建Minecraft地球服务的具体优势包括:
易于采用和实施。根据Sosnovske的说法,Azure Cosmos DB很容易被采用。
Sosnovske说:”开始使用Azure Cosmos DB非常简单,尤其是在.NET生态系统的上下文中。我们只需安装Nuget包并将其指向正确的终结点。服务文档非常全面,理解了SDK的工作原理,我们没有任何重大问题。
零维护。作为Microsoft Azure的一部分,Azure Cosmos DB是一个完全托管的服务,这意味着Minecraft地球服务团队中没有人需要担心修补服务器、维护备份、数据中心故障等。
“不必处理日常运营是一个巨大的好处,”Sosnovske说。但是,这实际上是在Azure上构建的好处。
保证低延迟。开发人员选择Azure Cosmos DB的一个重要原因是,它为在世界任何地方以任何比例读取和写入提供受保障的毫秒级(<10ms)延迟SLA。相比之下,表存储延迟会更高,没有受保证的上限限制。
Sosnovske说:”Azure Cosmos DB正在如承诺的那样交付,因为我们看到读取的平均延迟为7毫秒。
弹性可扩展性。由于Azure Cosmos DB提供的弹性可扩展性,游戏获得了顺利启动。
Sosnovske说:”Azure Cosmos在扩展我们的服务方面,从来就不是瓶颈。”自首次发布以来,我们为优化性能做了大量工作,但是我们知道这样做的一个巨大的好处是,我们不会达到任何可伸缩性限制。起初,我们可能为吞吐量支付了更多,但这比拥有无法跟上用户需求增长的服务要好得多。
一键式多区域分布。对于Azure Cosmos DB,地理分布对于Minecraft地球服务开发人员来说是一项微不足道的任务。对预配吞吐量(以RU/s表示)的调整同样简单,因为Azure Cosmos DB透明地在所有区域执行必要的内部操作,持续提供唯一的系统映像。
Sosnovske说:”一键式多区域分布是一个巨大的好处。”在启用多主支持时,我们确实必须更仔细地思考如何对系统进行建模,但工作比自己解决问题要少一些。
合规。通过在Azure Cosmos DB中使用”生存时间(TTL)”,开发人员可以在短时间内安全地存储基于位置的游戏数据,而不必担心违反合规性要求,如欧洲通用数据保护法规(GDPR)。
Sosnovske解释道:”它让我们驱动类似’此玩家应只能在给定时间段内兑换此位置一次’这样的工作流,之后Azure Cosmos DB会自动清理我们设置的TTL中的数据。
在总结他在Azure Cosmos DB方面的经验时,Sosnovske的说法是相当积极的。
“Azure Cosmos DB非常可靠,在花时间了解基本概念后易于使用,最重要的是,在编写代码时,它是“透明的”。当我团队中的初级开发人员处理功能时,他们无需考虑数据库或数据的存储方式;他们可以简单地为域编写代码,让它工作。
相关推荐: 【运营实操】能做好这些工作,你的亚马逊店铺就可以飞起来了
选择好你得产品 1选产品要适合自身情况 做电商尽量从自己熟悉的行业入手,综合考虑身边的环境,做熟悉的业务才能事半功倍。选产品要选择自己较为了解的东西,并且是在质量和价格上,自己具有先天优势的东西,结合自身情况选择销售的产品尤为重要。 2尽可能地拿到上…
码刀科技(www.lekshop.cn)是国内知名企业级电商平台提供商,为企业级商家提供最佳的电商平台搭建(多种模式电商平台搭建:B2B/B2B2C/B2C/O2O/新零售/跨境等)、平台管理系统开发及互联网采购解决方案服务, 联系客服了解更多.