跳转到内容
pstack 中文学习站

principle-make-operations-idempotent

你在看 pstack 0.15.27 时的版本,最新版在这里

设计操作,使其无论运行多少次、无论上次运行停在哪里,都收敛到正确 state。每个 mutating state 的操作都应回答:「运行两次会怎样?上次运行半途崩溃会怎样?」

原因: 命令、生命周期操作和处理循环运行在崩溃、重启和重试是常态的环境。若 partial state 改变下次运行结果,每次重启都会变成调试 session。

思路: 每一步都根据当前状态决定怎么做,而不是根据上次运行原本想做什么。读取当前状态,与目标比较,只应用两者的差异。这样写出的步骤可以安全地重复执行,因为再次执行时会发现已经没有事可做。

一次运行留下的任何东西,比如锁、临时文件、写了一半的记录或已认领的任务,下一次运行都必须能认出它是否已经失效。判断是否失效,要依据在上次运行可能停止的任何位置都成立的证据,不能只看常见情况。如果下一次运行无法判断某个标记是否失效,每次崩溃都得靠人工清理。比如,先写入临时路径,再重命名到目标位置;或者按内容而不是创建顺序比较产物。

检验:

  1. 连续运行两次会怎样?
  2. 上次运行在每个可能点崩溃会怎样?
  3. 重执行是否收敛到相同 end state?

若任一答案是「取决于留下了什么 state」,操作就需要 reconciliation step。