请求解析OTP Supervisor重启策略的命名逻辑
完全懂这种命名上的纠结——OTP的术语很多是从Erlang原生语境直接沿用过来的,对非英语母语者来说确实容易摸不着头脑。我结合每个策略的行为,帮你拆解它们命名的专业逻辑:
one_for_one
这个命名的核心是「针对一个故障进程,只重启这一个进程」。第一个one指的是触发故障的单个子进程,第二个one指的是被重启的进程范围(仅它自己)。命名直接概括了行为逻辑:只要有单个子进程终止,Supervisor只会重启这个出问题的进程,完全不影响其他正常运行的子进程。one_for_all
这里的one同样指触发故障的单个子进程,而all代表所有子进程。意思是「只要有一个子进程出故障,就对所有子进程进行处理」。这类策略适用于子进程之间强依赖的场景——一个进程挂了,其他进程也无法独立工作,所以Supervisor会先终止所有其他子进程,再按启动顺序重启全部。命名精准点出了故障触发源和影响范围的对应关系。rest_for_one
这个命名的逻辑稍绕,one还是指出故障的那个子进程,rest则特指在该进程之后启动的其余子进程。翻译过来可以理解为「针对这一个故障进程,重启它和它之后的所有进程」。因为Supervisor启动子进程是有固定顺序的,后面的进程往往依赖前面的进程才能正常运行,当前面的进程挂了,后续依赖它的进程也会失去支撑,所以需要终止并重启故障进程及所有在它之后启动的进程。
这些命名本质是Erlang简洁式术语的直译,核心都是用「触发源+处理范围」的组合来概括策略的核心行为,抓住这个对应关系就很容易理解啦。
内容的提问来源于stack exchange,提问作者Todoroki

