知识卡片

故障切换下避免任务重复

普通读书笔记卡 · 1629

内容

Cron任务的启动必须用启动时间而非任务名单独标记,否则同一高频任务的两次启动无法区分。领头人 进程崩溃后,新领头人接管的第一件事,是处理前任可能已启动但结果未知的操作:要么该操作对外部 系统幂等(重复执行无害),要么必须能通过查询外部系统状态无歧义地判断这次启动是否已成功。 二者满足其一,是故障切换后既不重复、又不遗漏执行的前提——这一约束也适用于故障转移后可能 重放动作的调度、消息消费或支付类系统。

参考来源

- 位置:《SRE:Google运维解密》第24章《分布式周期性任务系统》(源文件:_epub-src/OEBPS/Text/0009_0015.xhtml) - 结论依据:原文"领头人角色"一节指出必须以启动时间作为唯一标识符标记Cron任务,否则记录会产生歧义;"解决部分性失败情况"一节明确给出幂等或可无歧义查询外部系统状态这两个互斥条件,作为故障切换后正确处理未完成启动、避免重复或遗漏执行的前提。 - 原始内容:简单地标记某个Cron任务是不够的,应该将某次启动时间作为唯一标识符标记;否则在记录Cron任务的启动时可能会产生歧义……为了能够判断RPC是否成功发送,下列情况中的一个必须被满足:●所有需要在选举过后继续的,对外部系统的操作必须是幂等的(这样我们可以在选举过后重新进行该操作)。●必须能够通过查询外部系统状态来无疑义地决定某项操作是否已经成功。