亚搏在线登陆在骚乱运行在线服务:第VI部分

欢迎回到亚搏在线登陆系列!这种长期运行的系列探索和文件如何开发,部署和操作其后端基础架构。亚搏网页登录亚博论坛我们是尼古拉斯特蒂和Ala Shiban,Riot开发人员体验团队的软件架构师和产品经理。我们的团队负责骚乱开发人员在我们的玩家中如何建立,部署和操作游戏,专注于云无话的平台,使运输和运营游戏更容易。亚博论坛在我们的最后一批Maxfield Stewart近2年前,据我们的开发人员生态系统写道,然后使用了许多工具。自24个月以来,我们认为我们将在您面临的情况下更新,我们对我们所面临的新挑战以及我们学到的内容,以及我们的学说!

快速回顾

我们强烈推荐回去阅读早期的参赛作品,但如果你想直接进入这篇文章,这是一个超级浓缩版本来抓住你。

骚乱使用金属和云基础设施的混合来在世界各地操作后卫系统。这些后端系统被分成地理碎片,这是完全不同的服务部署,允许玩家与玩家一起参与英雄联盟。像大多数游戏后端一样,联盟后端开始作为由专用运营团队运营的巨石。随着时间的推移,骚乱已经接受了Devops实践和基于微服务的架构。第1部分该系列进入细节 - 为了帮助我们的开发人员提供更快的速度,骚乱倾斜地倾斜到码头容器中并开始在群集调度程序中运行它们。最后一篇文章,第五部分,讨论我们到达的许多工具以启用它。

那怎么样?

它令人敬畏。而且也很糟糕。

在本系列之前的进入时,我们正运行在5000以上的生产容器。这个数字没有停止增加,今天,我们单独在骚乱运营的地区运行超过14,500个容器。Riot Devs喜欢为玩家做出新的东西,并且可以让他们编写,部署和操作服务更容易,更多地创造新的和令人兴奋的体验。

在真正的Devops时尚,团队拥有并负责他们的服务。他们创建了部署,监控和运营服务的工作流程,并且当他们找不到他们想要的东西时,他们并没有害羞地远离发明它。这是我们开发人员的一个非常解放的时间,因为他们很少被封锁他们无法自己解决的事情。

然而,慢慢地,我们开始注意到一些令人担忧的趋势。我们的QA和负载测试环境每月都越来越稳定。我们将损失追踪误操作或过期依赖的时间越来越多的时间。孤立的,每次活动都没有任何关键,但总的来说,他们花费了我们的时间和精力,以至于我们更愿意花在创造球员价值上。

更糟糕的是,我们的非暴力碎片不仅开始表现出类似的困难,而且是一整套其他问题。合作伙伴经营者必须与越来越多的开发人员和船上越来越多的微服务界面接口,每个微服务都与其他方式不同。运营商现在必须努力工作,以生产工作和稳定的碎片。这些非暴力操作的碎片具有更高的事故率,可直接归因于微服务的不兼容的实时版本或其他类似的横向问题。

骚乱的发展和运营现实

在我们讨论我们如何解决包装,部署和操作之前,让我们花一分钟探索骚乱运营的背景。骚乱都没有独特,但所有这些细节的重叠都会通知我们如何组织自己,以便向所有玩家发货。

开发人员模型

骚乱工程师喜欢建造东西!为了方便他们这样做,我们采用了强大的Devops心态。团队构建并拥有其后端服务,确保在不按预期执行时对其进行支持和分类。By Andly,Riot工程师很高兴能够迅速迭代,并乐于为他们的实况服务负责。这是一个漂亮的标准Devops设置和骚乱并不在这里致力于任何内容。

有状态分片模型

对于历史,扩展和法律原因,骚乱产品的后端在碎片中组织。生产碎片通常在地理上部署地理位置接近目标受众。这具有许多好处,包括改进的延迟,更好的匹配,有限的故障域以及用于执行维护的明确峰值时间窗口。当然,我们还在内部和外部运行许多发展和QA碎片,如联盟公共测试环境(PBE)。

运营模式

这是事情变得有些复杂的地方。虽然骚乱是开发人员,符合合规性和理由的原因,我们与当地的运营商合作,为我们的一些碎片。实际上,这意味着骚乱开发人员必须打包碎片的每个组件,向运营商提供,并指示如何部署,配置和操作所有内容。防暴开发人员无法操作,可以访问,甚至可以在这些碎片中获得可见性。

迭代解决方案

尝试#1 - 新联盟部署工具

因为我们第一次尝试改善我们所采取的情况格林菲尔德方法并试图为骚乱借用开源组件和最小的骚乱特定功能来制作部署和操作故事。虽然努力成功部署了完整的英雄联盟碎片,工具被设计的方式没有表现开发人员和运营商预期的方式。团队对他们的工具表示不满,这被证明太难用于运营,而且过于约束开发人员。

因此,痛苦的决定是在部署第一个碎片后退出工具。虽然这可能似乎是侵略性的,但它使我们能够充分退出新的工具,因为所有团队仍然拥有自己的维护部署系统并且没有完全切断。

尝试#2 - 更多过程

由于我们的第一次尝试并不是我们希望的响亮的成功,我们转向了历史的加入过程传统。广泛的通信,清除发布日期,记录的流程,变更管理会议和仪式,而且目前的电子表格稍微搬到了针头但从不感觉不错。团队喜欢他们的Devops自由,而纯粹的体积和变化的速度强迫了较重的过程。虽然我们合作伙伴运营商的情况有所改善,但我们并没有达到运营栏和我们所需的生活质量。

尝试#3 - 元数据

在这一点上,我们决定尝试一种不同的方法。由于我们一直专注于开发人员作为我们工具的主要受众,我们开始调查如何专注于合作伙伴OPS人员的部署/运营系统。我们制作了工具,允许开发人员添加标准化的元数据,例如所需的配置和缩放特性,以及他们的Dock容器容器的封装微型操作。这创造了前进进度。操作员具有更标准化的理解方式,服务的配置和部署特性,并依赖于日常操作的开发人员。

此时,对本地和合作伙伴操作网站跨越的故障,事件和额外停机率显示出改进,但我们仍遇到频繁和避免的部署和运营失败。

尝试#4 - Riot的应用和环境模型

我们最终采取了新的方法,将焦点从个别服务转换为整个产品。这导致我们创建了一个高级声明性规范和对其采取行动的一组工具。在我们看看这个规范和工具不同的原因之前,让我们看看前三次尝试出了什么问题。

反映出错了

部署和操作产品,而不是服务

虽然拥抱Devops和MicroServices给了我们许多Upsides,但它创建了一个危险的反馈循环。开发团队制造了微服务,部署了他们,经营它们,并对他们的表现负责。这意味着他们对自己的优化日志,指标和流程,一般很少考虑他们的服务作为没有发展环境的某人或甚至工程能力必须有理由的事情。

由于开发人员保持创造越来越多的微服务,操作整体产品变得非常困难,导致越来越多的故障。最重要的是,骚乱的流体团队结构留下了一些不明确的所有权的微服务。这使得知道谁在Trizing困难时联系,导致许多错误归因于归因于归因。合作伙伴区域OPS团队因越来越多的异构微服务,部署过程和组织变化而被淹没。

了解原因

我们检查了骚乱运营区域和非暴力操作区域的故障,并将故障频率的差异蒸馏出来,进入一个关键观察:

允许拒绝分布式系统的变化流最终会导致可预防的事件。

当团队正在寻求跨其界限时,失败开始发生,其中依赖关系要求捆绑具有多个更改的释放。团队要么采用人类的流程,以创建释放周期,通过方案管理仪式协调发布,或者他们可以按照较小的规模打破ad-hoc释放变更,导致团队争夺兼容版本的兼容排列。

两者都有他们的利弊,但倾向于在大型组织中分解,其中十几个团队需要以协调的方式连续发布数百个代表共享产品的微服务,并且允许这些微服务使用不同的开发实践。甚至更糟糕的是,试图将这些流程应用于合作伙伴运营商,由于它们缺乏关于件全部适合在一起的背景而受到困难的困难。

新解决方案:RIOR的应用和环境模型

鉴于以前的尝试未能产生所需的结果,我们决定通过创建一种捕获捕获的分布式产品的自由声明性规范来消除部分状态操纵 -环境。环境包含完全指定,部署,配置,运行和操作一组分布式微服务所需的所有声明性元数据集中代表一个产品并且是全面和不可忽略的版本。对于那些想知道的人来说,我们选择了“环境”,因为它是最小骚乱中的超负荷术语。命名的东西很难。

随着推出的Runeterra的传说,我们证明我们可以描述一个整个微服务游戏后端,包括游戏服务器,并将其部署,运行,并作为骚乱地区的产品以及全球合作伙伴数据中心。我们还证明了实现这一目标的能力,同时改善了我们长大地爱的Devops方法的upsides。

自以为是什么?

该规范描述了服务捆绑包之间的分层关系,或者环境

捆绑到环境规范的应用规范

陈述和高水平

声明性规范的一个好处是它是运营商友好。其中一个困难的合作伙伴运算符呼吁他们无法理解,调整,并潜在自动化整个游戏后端的部署方式。规范的陈述性质意味着它不需要工程师具有脚本或编程专业知识,以对规范中的大多数内容进行更改。

保持规范高级别帮助将游戏后端的定义与基础实现分开。这使我们能够从我们的内部乐队/调度程序移动到基于Mesos的计划程序,并考虑迁移到Kubernetes.对游戏工作室的影响最小。它还使我们的合作伙伴运算符在需要时在其基础架构组件中交换。例如,它允许操作员使用不同的指标聚合系统而不需要微服务仪器更改。

不可变和版本

我们发现,在快节奏的Devops世界中有效地部署和运营,具有共享语言来引用服务和环境至关重要。版本控制服务和环境以及其关联的元数据允许我们确保所有位置都部署了所有所有位置的正确版本。它允许我们的合作伙伴运营商确定性地知道并兑换给我们运行的版本。此外,当应用于整个环境时,它提供了一种可怕的服务,可以是Qaed并标记为好的服务。此捆绑删除了在向合作伙伴传达新版本时错过了依赖性的任何机会。

使这些版本无法实现,确保我们维护这种共同语言。如果在两个不同的碎片中部署了相同版本的服务,我们现在肯定地知道它们是一样的。

经营地专注

由于我们的目标是提高合作伙伴运营商可以向其玩家提供的服务质量,我们很快意识到部署软件只是第一步。了解如何进行分类,操作和维护实况系统同样重要。

从历史上看,我们严重依赖流程书。那些由开发人员的成功进行了不同程度的成功,他们将所有从所需配置值记录到高级架构。为了将合作伙伴运营商能够配置和运营每个服务所需的全部知识,我们决定将这些运行书中包含的信息带到我们服务规范的最前沿。这大大减少了在新服务上花费的时间伴侣区域,并且被保险他们被告知他们更新了微服务的所有重要变化。

今天,合作伙伴运营商使用规范了解操作元数据,包括所需/可选配置,缩放特征,维护操作,重要的指标/警报定义,部署策略,服务间依赖,以及越来越多的其他有用信息。

处理碎片差异

当然,碎片不是彼此的精确副本。虽然我们想要保持它们尽可能靠近彼此,但总有一些必须不同的配置。数据库密码,支持的语言,缩放参数以及特定调整参数必须每分碎片不同。为了支持此模型,我们的工具使用分层覆盖系统部署环境规范,允许运营商专注于专门的部署,同时仍然知道它们都是从已知的好版本中派生。让我们看看它是如何工作的!

一个简单的游戏后端可以包括两个环境,一个用于游戏服务器,另一个用于元游戏服务(排行榜,匹配等)。元游戏环境由多个服务组成:排行榜,匹配,匹配历史等。每个服务由一个或多个Docker图像组成,概念上等同于Kubernetes.荚。对于所有环境和哲学,环境封装了相同的层次结构 - 没有异常 - 没有异常 - 在任何受支持的基础架构或云上部署,运行和操作游戏后端和所有依赖项所需的一切。

该规范还包括运行和操作整个环境所需的所有元数据。一个越来越多的集合,包括配置,秘密,指标,警报,文档,部署和卷展策略,入站网络限制以及存储,数据库和缓存要求。

下面我们有两个地区的两个假想游戏碎片部署的例子。您可以看到它们都包括元游戏环境和游戏服务器环境。欧盟碎片中的游戏服务器 - 刺激环境在美洲碎片中落后相当于一个。这为游戏和操作团队提供了一种描述和比较不同的游戏碎片部署的通用语言。简单地维护了每个环境的越来越多的服务数量,可以可靠地部署数十分碎片。

游戏碎片部署的例子

我们的下一步:延迟意识到调度

我们希望能够描述服务之间的预期和可接受的延迟,并具有底层地区和较低级别的PAAS服务的工具优化将满足这些需求。这将导致某些服务共同位于同一机架,主机或云区域与允许它们分布在其他机架中。

由于游戏服务器的性能特征和支持服务,这对我们非常重要。骚乱已经是一个多云公司,利用我们自己的数据中心,AWS和合作伙伴云,但我们依靠静态设计的拓扑。纸牌游戏和亚博论坛射击者有不同的配置文件,而且不必手动拓扑,以便优化一个场景或其他可以在游戏上占用的工程时间。

最后的话

我们正面临着对游戏中的稳定性降低,主要是在合作伙伴操作的游戏碎片中。亚博论坛工具团队捆绑开源部署工具并将元数据添加到容器,而游戏团队则实现了集中式发布过程。这些方法解决了症状,但不是根本原因,这意味着我们未能达到我们针对的质量酒吧。

我们最终降落的解决方案推出了一种新的规范,捕获了整个游戏后端和所有依赖项的整个拓扑,层次结构和元数据。这种方法有效,因为它导致捆绑的容器的一致版本,它们的依赖关系,它们应该如何彼此交互,以及启动和操作整个游戏所需的所有支持元数据。不变性导致确定性部署和可预测的操作。

作为平台团队,我们的目标是选择系统和构建块,从而创造良性周期,其中具有特色开发工作自然会导致易于操作的产品。将Devops模型的敏捷性与易于操作的整个产品结婚,是长期组织敏捷的关键。我们对环境捆绑的方法直接改善了我们的运营指标,更重要地提高了玩家体验的质量。我们很高兴看到其余的行业如何解决类似的问题。我们看到了来自两者的想法和项目CNCF.(云本机计算基础)和来自大云供应商,如Microsoft Open Application Model规范。我们希望其中一些项目取代了我们的本土规范,并融入了整个行业范围的解决方案。

在未来的文章中,我们将更详细地探讨骚乱规范,看着示例并讨论我们设计中的权衡和骚乱特定的快捷方式。

谢谢阅读!如果您有疑问,请随时在下面的评论中发布它们。


有关更多信息,请查看此系列的其余部分:

第一部分:简介
第二部分:调度
第三部分:带OpenContrail和Docker的网络
第三部分:Part Deux:带OpenContrail和Docker的网络
第四部分:动态应用 - 微服务生态系统
第V部分:动态应用程序 - 开发人员生态系统
第VI部分:产品,而不是服务(本文)

发表于Nicolas Tittley和Ala Shiban