近期,一个线上的应用挂掉,导致整个节点上分布的应用收到影响,根绝错误日志,发现原来是在当时的环境(较特殊,一个应用挂掉重启时,会发生匹配错误,导致启动不起来)。匹配错误处理了,接下来就是找为什么节点会挂掉的原因
先把该应用原来的启动配置发下:
- start_xxapp() ->
- case supervisor:start_child(
- game_server_sup,
- {mod_xx,
- {mod_xx, start_link,[]},
- transient, infinity, supervisor, [mod_xx]}) of
- {ok, Pid} ->
- timer:sleep(1000),
- Pid;
- _ ->
- undefined
- end.
根据,OTP设计文档中,启动策略有三类:
1、permanent 应用挂掉之后,其他所有的应用和运行中的系统跟着一起遭遇,都会挂
2、transient 应用收到normal终止信号时,其他应用和运行中的系统不熟影响,收到shutdown终止信号时,效果就和permanent一样了。由于,监督树的终止信号shutdown,所以,启动监督树的时候通常不用这个参数。
3、temporary 独立,该应用的死活不会影响到其他应用和runtine-time system
根据这些规则,将上面的应用启动改成:
- start_xxapp() ->
- case supervisor:start_child(
- game_server_sup,
- {mod_xx,
- {mod_xx, start_link,[]},
- temporary, 2000, supervisor, [mod_xx]}) of
- {ok, Pid} ->
- timer:sleep(1000),
- Pid;
- _ ->
- undefined
- end.
这样,就算是该应用挂掉,该节点和该节点上的其他应用不熟影响,更符合OTP的理念:容错。
阅读(2076) | 评论(0) | 转发(1) |