运行任何可扩展的分布式平台都需要对可靠性的承诺,以确保客户在需要时获得所需的东西。 依赖关系可能相当复杂,尤其是对于像 Roblox 这样大的平台。 构建可靠的服务意味着,无论依赖关系的复杂程度和状态如何,任何给定的服务都不会被中断(即高度 可使用),将运行无错误(即高 质量)并且没有错误(即 容错).
为什么可靠性很重要
我们的账户身份团队致力于实现更高的可靠性,因为我们构建的合规服务是平台的核心组件。 破坏合规性可能会产生严重的后果。 阻止 Roblox 自然运行的成本非常高,需要额外的资源才能在故障后恢复,并且会削弱用户体验。
典型的可靠性方法主要关注可用性,但在某些情况下,术语是混用和误用的。 大多数可用性测量仅评估服务是否启动和运行,而分区容差和一致性等方面有时会被遗忘或误解。
根据 CAP 定理,任何分布式系统只能保证这三个方面中的两个,所以我们的合规服务为了高可用和分区容错牺牲了一些一致性。 尽管如此,我们的服务牺牲很少,并找到了机制来实现与下面解释的合理架构更改的良好一致性。
达到更高可靠性的过程是迭代的,紧密的测量匹配连续工作,以便在事故发生之前预防、发现、检测和修复缺陷。 我们的团队在以下实践中发现了强大的价值:
- 正确的测量 – 围绕如何向客户提供质量以及依赖项如何向我们提供质量,建立全面的可观察性。
- 主动预期 – 执行架构审查和依赖风险评估等活动。
- 优先纠正 – 更加关注与我们的服务相关联的服务和依赖项的事件报告解决方案。
建立更高的可靠性需要质量文化。 我们的团队已经在投资以绩效为导向的开发,并且知道流程的成功取决于其采用。 团队完全采用了这个过程,并将这些实践作为标准应用。 下图突出显示了该过程的组成部分:
正确测量的力量
在深入研究指标之前,需要快速澄清一下服务水平测量。
- SLO(服务水平目标)是我们团队所追求的可靠性目标(即 99.999%)。
- SLI(服务水平指标)是给定时间范围内实现的可靠性(即去年 99.975 月的 XNUMX%)。
- SLA(服务水平协议)是我们的消费者同意在给定时间范围内(即每周 99.99%)交付和期望的可靠性。
SLI 应该反映可用性(没有未处理或丢失的响应)、容错性(没有服务错误)和达到的质量(没有意外错误)。 因此,我们将 SLI 定义为成功响应与发送到服务的总请求相比的“成功率”。 成功的响应是那些按时间和形式发送的请求,这意味着没有 发生连接、服务或意外错误。
此 SLI 或成功率是从消费者(即客户)的角度收集的。 目的是衡量交付给我们消费者的实际端到端体验,以便我们有信心满足 SLA。 不这样做会产生一种错误的可靠性感,忽略与客户联系的所有基础设施问题。 与消费者 SLI 类似,我们收集依赖项 SLI 以跟踪任何潜在风险。 在实践中,所有依赖 SLA 都应该与服务 SLA 保持一致,并且与它们存在直接依赖关系。 一个人的失败意味着所有人的失败。 我们还跟踪和报告来自服务本身(即服务器)的指标,但这不是高可靠性的实际来源。
除了 SLI,每个构建都会收集我们的 CI 工作流程报告的质量指标。 这种做法有助于加强质量门控(即代码覆盖率)并报告其他有意义的指标,例如编码标准合规性和静态代码分析。 这个话题之前已经在另一篇文章中介绍过, 构建性能驱动的微服务. 在谈到可靠性时,对质量的认真遵守加起来,因为我们为获得优异成绩而投入的越多,我们就越有信心系统在不利条件下不会出现故障。
我们的团队有两个仪表板。 一个提供对消费者 SLI 和依赖项 SLI 的所有可见性。 第二个显示所有质量指标。 我们正在努力将所有内容合并到一个仪表板中,以便我们关心的所有方面都得到整合,并准备好在任何给定的时间范围内进行报告。
预测失败
干 建筑评论 是可靠的基本部分。 首先,我们确定是否存在冗余,以及当依赖关系下降时服务是否有生存能力。 除了典型的复制思想之外,我们的大多数服务都应用了改进的双缓存水合技术、双恢复策略(例如故障转移本地队列)或数据丢失策略(例如事务支持)。 这些主题足够广泛,足以保证另一个博客条目,但最终最好的建议是实施考虑灾难场景并将任何性能损失最小化的想法。
另一个值得期待的重要方面是任何可以改善连接性的东西。 这意味着对客户端的低延迟采取积极的态度,并使用缓存控制技术、sidecar 和超时、断路器和重试的性能策略为非常高的流量做好准备。 这些实践适用于任何客户端,包括 HTTP 和 gRPC 中的缓存、存储、队列和相互依赖的客户端。 这也意味着改善来自服务的健康信号,并了解健康检查在所有容器编排中都发挥着重要作用。 作为健康检查反馈的一部分,我们的大多数服务都会发出更好的降级信号,并在发送健康信号之前验证所有关键组件是否正常工作。
事实证明,将服务分解为关键和非关键部分有助于专注于最重要的功能。 我们曾经在同一个服务中拥有仅限管理员的端点,虽然它们不经常使用,但它们会影响整体延迟指标。 将它们转移到自己的服务中,对每个指标都有积极的影响。
依赖风险评估 是识别依赖关系潜在问题的重要工具。 这意味着我们识别具有低 SLI 的依赖关系并要求 SLA 对齐。 这些依赖项在集成步骤中需要特别注意,因此我们需要额外的时间来基准测试和测试新的依赖项是否足够成熟以适应我们的计划。 一个很好的例子是我们对 Roblox 存储即服务的早期采用。 与此服务的集成需要提交错误单和定期同步会议以交流发现和反馈。 所有这些工作都使用“可靠性”标签,因此我们可以快速识别其来源和优先级。 表征经常发生,直到我们确信新的依赖项已经为我们准备好了。 这项额外的工作有助于将依赖关系拉到所需的可靠性水平,我们期望为共同目标而共同行动。
将结构带入混乱
发生事故是不可取的。 但是当它们发生时,为了更可靠,需要收集和学习有意义的信息。 我们的团队有一个团队事件报告,该报告是在典型的公司范围报告之外创建的,因此我们关注所有事件,无论其影响规模如何。 我们找出根本原因并优先考虑所有工作以在未来减轻它。 作为本报告的一部分,我们召集其他团队以高优先级修复依赖事件,跟进适当的解决方案,回顾并寻找可能适用于我们的模式。
该团队制作了一个 每项服务的每月可靠性报告 这包括此处解释的所有 SLI、我们因可靠性而打开的任何票证以及与服务相关的任何可能事件。 我们非常习惯于生成这些报告,因此下一个自然步骤是自动提取它们。 进行这种定期活动很重要,它提醒我们在我们的开发中不断跟踪和考虑可靠性。
我们的检测包括自定义指标和改进的警报,以便在发生已知和预期问题时尽快呼叫我们。 每周都会审查所有警报,包括误报。 在这一点上,完善所有文档很重要,这样我们的消费者就知道何时触发警报和发生错误时会发生什么,然后每个人都知道该做什么(例如,经常调整和更新剧本和集成指南)。
说到底, 在我们的文化中采用质量是实现更高可靠性的最关键和决定性因素. 我们可以观察到这些应用于我们日常工作的做法是如何得到回报的。 我们的团队痴迷于可靠性,这是我们最重要的成就。 我们提高了对潜在缺陷可能产生的影响以及何时引入它们的认识。 实施这些实践的服务始终达到其 SLO 和 SLA。 帮助我们跟踪我们一直在做的所有工作的可靠性报告证明了我们团队所做的工作,并且是为其他团队提供信息和影响的宝贵经验。 这就是可靠性文化如何触及我们平台的所有组件。
通往更高可靠性的道路并非一帆风顺,但如果您想构建一个可信赖的平台来重新构想人们如何聚集在一起,那么这是必要的。
Alberto 是 Roblox 帐户身份团队的首席软件工程师。 他在游戏行业工作了很长时间,在许多 AAA 游戏和社交媒体平台上享有盛誉,重点关注高度可扩展的架构。 现在,他通过应用最佳开发实践帮助 Roblox 实现增长和成熟。
该职位 提供大规模平台可靠性 最早出现 Roblox博客.
- "
- a
- 关于
- 账号管理
- 实现
- 活动
- 活动
- 增加
- 额外
- 采用
- 不利的
- 协议
- 所有类型
- 已经
- 分析
- 另一个
- 预料
- 应用的
- 使用
- 应用
- 的途径
- 建筑的
- 围绕
- 刊文
- 相关
- 关注我们
- 自动化
- 可用性
- 可使用
- 意识
- 因为
- before
- 作为
- 如下。
- 基准
- 最佳
- 超越
- 博客
- 带来
- 问题
- 建立
- 呼叫
- 关心
- 例
- 原因
- 支票
- 客户
- 码
- 编码
- 收集
- 如何
- 承诺
- 承诺
- 提交
- 相当常见
- 通信
- 相比
- 符合
- 组件
- 条件
- 信心
- 信心
- 分享链接
- 连接方式
- 考虑
- 经常
- 消费者
- 消费者
- 容器
- 核心
- 可以
- 创建信息图
- 创建
- 积分
- 危急
- 文化塑造
- 习俗
- 合作伙伴
- XNUMX月XNUMX日
- data
- 更深
- 提升
- 交付
- 提供
- 需求
- 依靠
- 确定
- 研发支持
- 直接
- 灾害
- 分布
- 向下
- 驱动
- ,我们将参加
- 早
- 端至端
- 工程师
- 特别
- 每个人
- 一切
- 例子
- 优秀
- 期望
- 预期
- 体验
- 广泛
- 失败
- 反馈
- (名字)
- 固定
- 专注焦点
- 重点
- 聚焦
- 遵循
- 以下
- 申请
- 发现
- 止
- ,
- 实用
- 功能
- 根本
- 未来
- 游戏
- 盖茨
- 发电
- 目标
- 非常好
- 事业发展
- 保证
- 方针
- 发生
- 发生
- 健康管理
- 帮助
- 帮助
- 帮助
- 相关信息
- 高
- 更高
- 亮点
- 高度
- 创新中心
- HTTPS
- 思路
- 鉴定
- 身分
- 影响力故事
- 实施
- 实施
- 重要
- 改善
- 改善
- 改善
- 其他
- 包括
- 包含
- 增加
- 行业中的应用:
- 影响
- 信息
- 基础设施
- 积分
- 意图
- 投资
- IT
- 本身
- 知道
- 已知
- 学习用品
- Level
- 小
- 本地
- 长
- 看
- 使
- 匹配
- 事项
- 成熟
- 到期
- 意
- 有意义的
- 手段
- 衡量
- 媒体
- 会议
- 指标
- 杂
- 更多
- 最先进的
- 移动
- 自然
- 必要
- 虽然
- 操作
- 操作
- 管弦乐编曲
- 秩序
- 其他名称
- 最划算
- 己
- 部分
- 员工
- 性能
- 件
- 计划
- 平台
- 平台
- 播放
- 点
- 观点
- 政策
- 积极
- 可能
- 潜力
- 功率
- 在练习上
- 当下
- 校长
- 优先
- 问题
- 过程
- 质量
- 快速
- 很快
- 达到
- 合理
- 恢复
- 恢复
- 反映
- 关于
- 可靠
- 报告
- 业务报告
- 要求
- 必须
- 资源
- 评论
- 风险
- 路
- Roblox
- 角色
- 根
- 运行
- 同
- 可扩展性
- 鳞片
- 感
- 服务
- 特色服务
- 类似
- 自
- 单
- So
- 社会
- 社会化媒体
- 社会化媒体平台
- 软件
- 软件工程师
- 一些
- 特别
- 站
- 标准
- Status
- 商店
- 策略
- 强烈
- 成功
- 成功
- SUPPORT
- 系统
- 说
- 团队
- 技术
- 条款
- test
- 因此
- 三
- 门票
- 次
- 时间表
- 一起
- 公差
- 工具
- 主题
- Topics
- 跟踪时
- 交通
- 理解
- us
- 折扣值
- 确认
- 查看
- 能见度
- 周
- 什么是
- 是否
- 而
- 也完全不需要
- 工作
- 加工
- 将