Supervisor行为分析和实践
1.简介
2.分析
2.1 重启策略
rest_for_one:针对一个子进程列表,一个子进程停止,停止列表中该子进程及后面的子进程,并依次重启这些子进程
2.2 最大重启频率
2.3 子进程说明
child_spec() = {Id,StartFunc,Restart,Shutdown,Type,Modules}
Id = term()
StartFunc = {M,F,A}
M = F = atom()
A = [term()]
Restart = permanent | transient | temporary
Shutdown = brutal_kill | int()>0 | infinity
Type = worker | supervisor
Modules = [Module] | dynamic
Module = atom()
permanent:子进程总是被重启
Shutdown:关闭时间
Type:子进程的类型 worker | supervisor
Modules : 回调模块
如果子进程是supervisor、gen_server、gen_fsm则Modules是回调模块name的列表,如果为gen_event则为dynamic。(未验证)
3.实例
3.1 simple_one_for_one实例
-module(add_sup). -behaviour(supervisor). -export([start_link/0, start_child/0]).
-export([init/1]). -define(SERVER, ?MODULE). start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
start_child() ->
supervisor:start_child(?MODULE, []). init([]) ->
RestartStrategy = simple_one_for_one,
MaxRestarts = 2,
MaxSecondsBetweenRestarts = 100, SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts}, Restart = permanent,
Shutdown = 20000,
Type = worker, AChild = {add2, {add2, start_link, []},
Restart, Shutdown, Type, [add2]}, {ok, {SupFlags, [AChild]}}.
通过调用start_child/0来动态的加入子进程。
start_link() ->
gen_server:start_link(?MODULE, [], []).

3.2 普通子进程添加到监控树
普通子进程代码:
-module(common).
-author("Administrator"). -export([start_link/0, start_loop/2]). start_link() ->
Res = proc_lib:start_link(?MODULE, start_loop, [self(), ?MODULE]), %%启动一个普通进程
Res. start_loop(Parent,Name) ->
register(Name, self()), %%给普通进程命名,否则默认是pid()。
proc_lib:init_ack(Parent, {ok, self()}),
loop(). loop()->
receive
Args ->
io:format("args:~p~n",[Args])
end.
{common, {common, start_link, []}, permanent, 10000, worker, [common]}

普通子进程的终止与重启:

3.3 重启动态添加的子进程
对于监控树A的一个子进程是另一颗监控树B,监控树B有多个动态加入的子进程,若B重启后那么动态加入的子进程将不复存在,若B重启后需要想重新加入这些子进程,一、记录动态加入子进程的信息,当监控树重启后再动态加入以前的子进程;二、改进supervisor的实现,可以重启动态加入的子进程(未实践,rabbitmq中对supervisor修改来实现这个功能)。
init([]) ->
{ok, ets:new(proc_ets,[duplicate_bag, public, named_table, {keypos,1}])}.
当前监控树


2.动态加入子进程,并记录信息;重启子监控树,并动态加入子进程
-module(add_sup).
-include("ets_arg.hrl").
-behaviour(supervisor). -export([start_link/0, start_child/1]).
-export([init/1]). -define(SERVER, ?MODULE). -spec(start_link() ->
{ok, Pid :: pid()} | ignore | {error, Reason :: term()}).
start_link() ->
{ok, Pid} = supervisor:start_link({local, ?SERVER}, ?MODULE, []),
case ets:lookup(?ETS, ?MODULE) of
Object -> load_dynamic_proc(Object) %% 动态的加入存储的子进程
end,
{ok, Pid}. start_child(_Type) ->
{ok, Pid} = supervisor:start_child(?MODULE, []),
case _Type of
restart -> ok;
_->ets:insert(?ETS,{?MODULE, ?SIMPLE, []}) %% 存储动态加入子进程的信息
end,
{ok, Pid}. init([]) ->
RestartStrategy = simple_one_for_one,
MaxRestarts = 2,
MaxSecondsBetweenRestarts = 100, SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts}, Restart = permanent,
Shutdown = brutal_kill,
Type = worker, AChild = {add2, {add2, start_link, []},
Restart, Shutdown, Type, [add2]}, {ok, {SupFlags, [AChild]}}. load_dynamic_proc([])->
ok;
load_dynamic_proc([H|T]) ->
start_child(restart),
load_dynamic_proc(T),
{ok, H}.



监控树add_sup重启后,重新动态加入的相同类型的子进程
4.总结
Supervisor行为分析和实践的更多相关文章
- Log4j2分析与实践
当前网络上关于Log4j2的中文文章比较零散,这里整理了一下关于Log4j2比较全面的一些文章,供广大技术人员参考 Log4j2分析与实践-认识Log4j2 Log4j2分析与实践-架构 Log4j2 ...
- 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用
https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...
- 《Linux内核分析》实践4
<Linux内核分析> 实践四--ELF文件格式分析 20135211李行之 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格 ...
- 自定义View系列教程04--Draw源码分析及其实践
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- Gen_server行为分析与实践
1.简介 Gen_server实现了通用服务器client_server原理,几个不同的客户端去分享服务端管理的资源(如图),gen_server提供标准的接口函数和包含追踪功能以及错误报告来实现通用 ...
- AWVS结果分析与实践-XSS
今天趁着老师接项目,做了一丢丢实践,以下是一点点感触. 都知道AWVS是神器,可是到我手里就是不灵.拿了它扫了一个URL,结果提示XSS漏洞,实践没反应,只好愉快地享受了过程.来看看. ...
- 基于redis的分布式锁的分析与实践
前言:在分布式环境中,我们经常使用锁来进行并发控制,锁可分为乐观锁和悲观锁,基于数据库版本戳的实现是乐观锁,基于redis或zookeeper的实现可认为是悲观锁了.乐观锁和悲观锁最根本的区别在于 ...
- FastText 分析与实践
一. 前言 自然语言处理(NLP)是机器学习,人工智能中的一个重要领域.文本表达是 NLP中的基础技术,文本分类则是 NLP 的重要应用.在 2016 年, Facebook Research 开源了 ...
- 面经手册 · 第17篇《码农会锁,ReentrantLock之AQS原理分析和实践使用》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 如果你相信你做什么都能成,你会自信的多! 千万不要总自我否定,尤其是职场的打工人.如 ...
随机推荐
- ubuntu14.04安装MATLAB R2014a
1. 首先现在matlab2014a,http://pan.baidu.com/s/1pJGF5ov [Matlab2014a(密码:en52).该文件下载解压后如下所示: 2. 解压解压包(用lin ...
- mybatis 打印日志log4j.properties
log4j.rootLogger=DEBUG, Console #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log ...
- Netty4.x中文教程系列(二) Hello World !
在中国程序界.我们都是学着Hello World !慢慢成长起来的.逐渐从一无所知到熟悉精通的. 第二章就从Hello World 开始讲述Netty的中文教程. 首先创建一个Java项目.引入一个N ...
- Model的验证
ModelValidator与ModelValidatorProvider ModelValidator public abstract class ModelValidator { public v ...
- Docker基础技术:AUFS
AUFS是一种Union File System,所谓UnionFS就是把不同物理位置的目录合并mount到同一个目录中.UnionFS的一个最主要的应用是,把一张CD/DVD和一个硬盘目录给联合 m ...
- node-odata: ASP.NET WEB API OData的替代品
什么是 OData 协议? OData, 相信身为 .NET 程序员应该不为陌生, 尤其是它的实现: ASP.NET WEB API OData. 对于 OData, 官网上对其的定义是 OData ...
- Vi Usage
标签: linux 编辑工具 md 快捷键以及常用命令(前面带:的是命令) h -> 左移一个字符 j -> 下移一行 k -> 上移一行 l -> 右移一个字符 w或Shif ...
- 解决Hibernate Write operations are not allowed in read-only mode的方法
错误信息: org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed i ...
- 如何给桌面搬家(Win XP)
是不是习惯把一些常用的文件放在桌面上?或者接收个文件就直接放桌面了,这样用起来方便点. 可是一旦你重装系统或者恢复系统,桌面又回到了以前的状态,很多的文件就丢了.小心的话,重做系统前会做个备份.但如果 ...
- poj-2393 Yogurt factory (贪心)
http://poj.org/problem?id=2393 奶牛们有一个工厂用来生产奶酪,接下来的N周时间里,在第i周生产1 单元的奶酪需要花费ci,同时它们也有一个储存室,奶酪放在那永远不会坏,并 ...