Supervisor Behaviour是一个用来实现一个supervisor进程来监控其他子进程的模块
子进程可以是另一个supervisor,也可以是一个worker进程
worker进程一般使用gen_event,gen_fsm或gen_server behaviour来实现
一个使用该模块来实现的supervisor有一个接口方法的标准集,包括跟踪和错误报告的功能
supervisor用来构建一个分层进程结构,称为supervision tree,这是组织一个容错系统的好方式
1,Supervision原则
supervisor负责启动、停止和监控它的子进程
supervisor在必要时通过重启它的子进程来保持它们活着
supervisor的子被定义为一个子规范的list
当supervisor启动时,子进程按list从左至右的顺序启动
当supervisor终止时,它首先按启动顺序的反顺序终止它的子进程
2,例子
启动服务器的supervisor的callback模块:
-module(ch_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
start_link() ->
supervisor:start_link(ch_sup, []).
init(_Args) ->
{ok, {{one_for_one, 1, 60},
[{ch3, {ch3, start_link, []},
permanent, brutal_kill, worker, [ch3]}]}}.
one_for_one是重启策略之一
1和60定义了最大重启频率
tuple {ch3, …}是子规范
3,重启策略
3.1 one_for_one
如果一个子进程停止,则只重启该进程
3.2 one_for_all
如果一个子进程停止,所有其他子进程也停止,然后所有进程重启
3.3 rest_for_one
如果一个子进程停止,则启动顺序中在它之后的所有其他子进程也停止,然后停止的这些进程重启(跟楼上那位不一样)
3.4 simple_one_for_one
一个简化的one_for_one supervisor,所有的子进程都是同样进程类型并且是动态添加的实例
4,最大重启频率
supervisor有一个自带的机制来限制给定时间内重启的次数
这是通过MaxR和MaxT这两个参数来决定的
init(…) ->
{ok, {{RestartStrategy, MaxR, MaxT},
[ChildSpec, …]}}.
如果在最近的MaxT秒之内有超过MaxR次数的重启,则supervisor停止它本身和它所有的子进程
当supervisor停止后,下一个更高级别的supervisor进行下一步动作,重启该停止的supervisor或者终止本身
重启机制的意图是防止一个进程由于某些原因重复性的死掉
5,子规范
这是子规范的类型定义:
Module [...]