点 快速的未来即将来到您所在城市的活动。

加入我们的 Redis 发布

使用 Redis 来优化功能推出和错误分类

在努力运行、运行和运行时,你肯定不希望犯下骑士资本 (Knights Capital) 在 2012 年所犯的那项 4.6 亿美元的错误。这个领先的金融做市商单日的计算机系统故障为整个 IT 界提供了多项教训,其中包括你的系统组件的设计、实现和 DevOps 详细信息至关重要。在这篇两部分的博文中,我将分享一些能够帮助开发团队维护持续集成和持续部署 (CI/CD) 过程防呆措施的想法。尤其是,我将展示如何使用功能切换和功能上下文来管理持续更新以指示代码路由,存储日志数据以方便访问,以及借助 Redis 创建具有快速查找功能的错误数据库。

想象一下,你是一位工程主管,负责管理一个由多位开发者组成的团队,该团队负责一个拥有数千名并发用户的网络应用程序的前端。你的应用程序部署在 AWS 中,并且你每周都会推送更新。业务无法承受任何网络应用程序中断,因此,如果发生错误,你的团队必须立即回滚最近的更新。

你必须迅速识别问题代码,让相应的开发者修复代码,并将更改纳入后续发布的部分内容中。此外,产品团队一直在要求尽快将新功能普遍提供。那么,你如何快速对错误做出反应,并以业务要求的速度安全地部署功能请求呢?

在 2019 年游戏开发者大会 (GDC) 上,我参加了一场描述了一个经过深思熟虑的流程以可靠地执行每周软件发布的会议。该会议的头衔为“大规模调试:7000 万+ 月活跃用户的跨平台稳定性”,由 Roblox 的克里斯·斯维德勒(一位 Redis 客户)共同主持。克里斯对他的团队在遇到生产问题时如何不更改代码就修改应用行为分享了一个有趣的见解。他们使用功能标志,这与 Martin Fowler 的“功能切换”方法 非常类似。

新功能发布的 CI/CD 流程示例

Redis - Figure 2: Feature development and promotion
图 2:功能开发和推广

让我们分解一下图 2,该图概述了一种可以成为你 CI/CD 和分类流程一部分的做法。

  1. 一位开发者开始着手开发一项新功能。
  2. 该开发者和产品管理团队决定哪些方案会使用这些新功能(或许是针对部分用户)。
  3. 然后开发者想出一种切换策略,其中新代码和旧代码通过“if and else”块隔开。
  4. 一旦该开发者完成新功能代码,便可借助 DevOps 将金丝雀发布推广到生产环境中。
  5. 用户在一段时间内使用该应用程序,并且基于他们的角色和切换设置,他们会访问新代码或旧代码。
  6. 如果出现问题,该切换可以设置为否,以将所有用户转移到旧代码。
  7. 一段时间后,该功能将提升为(GA)一般可用性。

此策略对以下事项会有帮助

  1. 向产品中发送金丝雀版本以进行实时流量和真实用户的测试,而不是模拟;
  2. 及时禁用功能而不回滚任何代码;
  3. 通过切换标记启用功能或功能组合;以及
  4. 通过切换标记中存储的元数据对代码进行指纹识别,以便轻松识别负责的开发者(对于大型开发团队而言)。

但此方法可以更进一步,帮助分布式开发团队安全地发布新功能,并在需要时以最小的影响进行回滚。

CI/CD 与 Redis Enterprise

Redis - Figure 3: Managing toggles, context, errors & logs with Redis Enterprise
图 3:使用 Redis Enterprise 管理切换、上下文、错误和日志

Redis Enterprise适合在需要快速且持久数据库时。其能力包括:

  • 一个经过完全管理的 Redis 数据库即服务,拥有持久网络存储,可防止实例存储的短暂性。
  • CRDB,或无冲突复制数据库,跨越全球不同数据中心中驻留的多个 Redis Enterprise 集群进行创建。它以主动-主动和主动-被动部署的形式提供了高可用性
  • 强大的搜索能力(通过 RediSearch 模块),跨数据库集群运行搜索查询。
Redis - Figure 4: CRDB deployment of Redis Enterprise
图 4:Redis Enterprise 的 CRDB 部署

在本系列下一期中,我将提供更多详细信息和代码段,专门展示使用 Redis 构建的功能切换、功能上下文、错误数据库和日志数据库如何使您的 CI/CD 分流过程更有效和高效。