云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

企业网站_一直免费的服务器_好用

小七 141 0

Minecraft地球与Azure Cosmos DB第1部分:将Minecraft扩展到现实世界

这篇文章是一个分为两部分的系列文章的第1部分,讲述了组织如何使用azurecosmosdb来满足现实世界的需求以及它给他们带来的不同。在第1部分中,我们将探讨导致Minecraft Earth的服务开发人员选择Azure Cosmos DB的挑战,以及他们如何使用它以超低延迟捕获全球每个玩家的几乎所有动作。在第2部分中,我们将研究解决方案的工作负载,以及Minecraft Earth服务开发人员如何从azurecosmosdb上构建它受益匪浅。把地雷世界扩展到现实世界你可能听说过Minecraft游戏,即使你自己没有玩过。这是有史以来最畅销的电子游戏,自2011年以来已售出1.76亿册。如今,Minecraft每月有超过1.12亿玩家,他们可以在游戏的沉浸式、程序化生成的3D世界中发现和收集原材料、工艺工具,并建造结构或土方工程。根据游戏模式,玩家还可以与电脑控制的敌人作战,与其他玩家合作或竞争。2019年5月,微软宣布即将发布Minecraft Earth,并于2019年12月开始在全球范围内推出。与之前的游戏不同,Minecraft Earth通过增强现实(AR)的力量,使玩家能够在真实世界中体验雷神世界,从而将事情提升到一个全新的水平。对于Minecraft Earth玩家来说,这种体验是立即熟悉的,尽管与他们周围的世界有着深刻的融合。然而,对于微软Minecraft团队的开发者来说,Minecraft Earth的交付,尤其是支持游戏所需的权威后端服务,需要构建全新的东西。Minecraft地球服务开发团队的高级软件工程师Nathan Sosnovske解释说:"使用香草Minecraft,虽然您可以托管自己的服务器,但没有集中的服务权限。Minecraft Earth基于一个集中的、权威的服务,这是我们为Minecraft特许经营权建立的第一个‘重’服务。"在这个案例研究中,我们将研究Minecraft地球服务开发人员在交付他们需要的东西时面临的一些挑战,以及他们如何使用Azure Cosmos DB来满足这些需求。技术挑战:避免游戏中的滞后在Minecraft Earth客户端中,运行在基于iOS和Android的AR设备上,几乎每个玩家的动作都会导致对核心Minecraft Earth服务的写入。每次写入都是一个REST帖子,必须立即接受和确认,以避免任何明显的游戏延迟。"从服务的角度来看,Minecraft Earth需要低延迟写入和中等延迟读取,"Sosnovske解释道写入速度需要很快,因为客户端需要对每个资源进行确认,例如客户端可能需要渲染,例如,当玩家点击资源查看其中的内容时,我们不希望在处理相应的REST请求时图像挂起。中等延迟读取是可以接受的,因为我们可以使用客户端模拟,直到服务背后的备份模型可以更新以进行读取。"为了使挑战复杂化,Minecraft Earth服务的开发人员需要确保低延迟的写入,而不考虑玩家的位置。这就要求在每个提供Minecraft Earth的地理位置内的多个位置运行该服务的副本,以及将Minecraft Earth客户端路由到最近部署该服务的位置的内置智能。"美国东西海岸之间典型的网络延迟是70到80毫秒,"Sosnovske说如果一个在纽约的玩家不得不依赖旧金山的服务,反之亦然,那么游戏中的延迟是不可接受的。同时,游戏名为Minecraft Earth,这意味着我们需要让旧金山和纽约的玩家分享相同的游戏体验。要实现所有这些,我们需要在每个地理位置内的多个地理位置分布的数据中心中复制服务及其数据。"解决方案:基于azurecosmos数据库的事件源模式为了满足他们的技术需求,Minecraft地球服务开发者实现了一个基于azurecosmos数据库的事件源模式。"我们最初考虑使用Azure表存储来存储我们的纯附加事件日志,但是它没有针对读写延迟的任何sla,这使得这不可行,"Sosnovske说最终,我们选择了Azure Cosmos DB是因为它提供了10毫秒的读写服务级别协议,以及在每个地理位置的多个位置复制服务所需的全局分发和多主机功能。"通过事件源模式,Minecraft Earth服务不只是存储数据的当前状态,而是使用一个基于Azure Cosmos DB的append-only数据存储来记录在这种情况下对数据采取的全系列操作,映射到玩家采取的每个游戏内操作。在向客户端返回成功写入的即时确认后,订阅仅附加事件存储的队列将处理后处理,并将收集到的事件异步应用于Azure Blob存储中维护的域状态。为了进一步优化,Minecraft Earth开发者将事件源模式与领域驱动设计相结合,其中每个应用领域(如库存项目、人物简介或成就)都有自己的事件流。Sosnovske说:"我们将数据建模为事件流,这些事件流存储在仅附加日志中,并对内存中的模型状态进行更改,该状态用于驱动各种客户端视图。"该缓存状态在azureblob存储中维护,这对于读取来说足够快,并且有助于将azurecosmosdb的请求单位成本保持在最低水平。在许多方面,我们对Azure Cosmos DB所做的工作就像构建了一个非常非常有弹性的写缓存。"下图显示了基于Azure Cosmos DB的事件源模式是如何工作的:将Azure Cosmos DB放置到位在使用Azure Cosmos DB时,开发人员必须做出一些设计决策:Azure宇宙数据库API。开发人员选择使用azurecosmosdbcore(SQL)API是因为它提供了最好的性能和最大的易用性,以及其他所需的功能。"我们从头开始构建一个系统,因此不需要一个兼容层来帮助我们迁移现有代码,"Sosnovske解释道此外,我们依赖的一些azurecosmosdb特性(如TransactionalBatch)只支持Core(SQL)API。另外一个优势是,核心(SQL)API非常直观,因为我们的团队已经基本熟悉SQL了。"请阅读.NETSDK中的TransactionalBatch介绍以了解更多信息。分区键。开发人员最终决定根据用户在azurecosmos数据库中对数据进行逻辑分区。Sosnovske说:"我们最初再次对用户和域的数据进行分区,例如库存项目或成就,但发现这种细分过于细化,妨碍了我们充分利用Azure Cosmos DB中的数据库事务。"一致性级别。在azurecosmosdb支持的五个一致性级别中,开发人员选择了会话一致性,他们将会话一致性与大量的etag检查相结合,以确保数据被正确写入。Sosnovske解释说:"这是因为我们存储数据的方式,数据被建模为只附加的日志,其头文档作为指向日志尾部的指针。"写入数据库包括读取头文档及其etag,派生N+1日志ID,然后构造一个事务性批处理操作,该操作使用以前读取的etag覆盖头指针,并为日志条目创建一个新文档。在不太可能的情况下,日志已经写入,etag检查和尝试创建已经存在的文档将导致事务失败。不管另一个请求是否比我们写得快,或者我们的请求读取的数据稍微过时,都会发生这种情况。"在本系列的第2部分中,我们将研究解决方案的当前工作负载,以及Minecraft Earth服务开发人员如何从azurecosmosdb上构建它中获益。Azure Cosmos DB入门访问Azure宇宙数据库。了解有关Azure for Gaming的更多信息。