知识卡片
请求编号让故障切换后的重复请求变成幂等操作
内容
主进程刚做完一次可见操作(如磁盘写入)就崩溃,备份从检查点接管后很可能把操作再执行一遍,造成数据被写两次。Guardian给每个I/O请求打唯一序号,I/O进程记住处理过的序号,收到相同序号请求就不再重复执行而是直接返回第一次的结果。这本质是用记住做过什么、按编号去重,把不幂等操作包装成对调用方幂等。
参考来源
- 位置:《架构之美》第8章《Guardian:一个容错操作系统环境》8.8.2节《同步》(源文件:程序之美系列套装(6册)团队之美、项目管理之美、架构之美、数据之美、测试之美、安全之美/_epub-src/OEBPS/Text/part0181.xhtml)
- 结论依据:原文明确"如果主进程执行了外部可见的操作……备份进程在接管之后会重复这些操作……系统通过给每个I/O请求关联一个序号(称为同步ID)来解决这个问题。I/O进程记录了这些请求,如果它收到一个重复的请求,就简单地返回这个请求第一次调用的完成状态"。
- 原始内容:系统通过给每个I/O请求关联一个序号(称为同步ID)来解决这个问题。I/O进程记录了这些请求,如果它收到一个重复的请求,就简单地返回这个请求第一次调用的完成状态。