Meta Defcon

· 708 words · 2 minute read

一起读论文:Defcon: Preventing Overload with Graceful Feature Degradation

复杂系统中,一旦有故障发生,则往往容易发展成为Cascading Failures. 为了防止系统过载影响产品使用,Meta 开发了一个系统叫做:Defcon.

潜在方案及其权衡 🔗

作者首先列出了若干方案,及其对资源、研发投入、用户体验的影响:

overload-handle

Defcon 如何工作? 🔗

Knob 的定义 🔗

每个 knob 对应一个功能,它由一个四元组表示:

  • name: 功能名称(具有唯一性);
  • oncall:轮值负责团队;
  • level:范围为 [1, 2, 3, 4],数字越小级别越高;
  • enabled:打开/关闭状态。
from configs.knobs import KnobConfig
disableCommentsRanking = KnobConfig(
    name = "Feed/DisableCommentsRanking",
	oncall = "owner_team_oncall",
	leve = 2, # Impact Magnitude.
	enabled = True)
export(disableCommentsRanking)

Knob 的种类 🔗

  • Server-side knob: 由数据中心的服务器端使用,状态调整的响应时间为秒级。

  • Client-side knob: 客户端(手机、平板、穿戴设备等等)代码中使用,可以用来减少请求。其状态更新一般通过 Silent Push Notification, 或者Mobile Configuration Pull 等等。

Knob 的使用 🔗

应用通过读取 Knob 的状态做相应的处理。在测试过程中,或者事故处理时,运维操作人员可以通过工具改变 Knob 的状态。Defcon 会处理 Knob 的状态复制 - 使得该状态被相关服务、移动应用等感知)。Knob 状态存放在数据库中。

from configs import ConfigReader
disableCommentsRanking = ConfigReader(
    "Feed/DisableCommentsRanking")
comments = fetchComments()
if not disableCommentsRanking.enabled:
    comments.RankUsingModel()
else:
    comments.RankChronologically()

就是说,产品工程师可以通过 Knob定义框架来控制一段逻辑的执行条件。

系统架构 🔗

degredation

  • 用户:应用的使用者(移动应用/网页等等);
  • Degredation portal: 可视化看板、控制台;
  • Degredation CLI: 命令行工具(可以用来控制/配置 knobs);
  • Knob Acutator Service: 根据实时事件控制 knobs 的启用状态;
  • Degradable service: 可降级的服务。

事故处理 🔗

oncall

总结(个人观点) 🔗

这套系统的好处大概有:

  • 故障粒度的控制(设计和实现的时候就需要考虑故障);
  • 故障影响在功能层面的可视化以及;
  • 故障可直接在软件层面模拟(通过控制 Knob 状态)。

当然,天下没有免费的午餐。

  • 需要有监控系统的配合;
  • knob 的维护。
comments powered by Disqus