Erlang 应用启动策略

2103阅读 0评论2012-08-06 努力小伙
分类:系统运维

近期,一个线上的应用挂掉,导致整个节点上分布的应用收到影响,根绝错误日志,发现原来是在当时的环境(较特殊,一个应用挂掉重启时,会发生匹配错误,导致启动不起来)。匹配错误处理了,接下来就是找为什么节点会挂掉的原因
先把该应用原来的启动配置发下:

点击(此处)折叠或打开

  1. start_xxapp() ->
  2.     case supervisor:start_child(
  3.          game_server_sup,
  4.          {mod_xx,
  5.          {mod_xx, start_link,[]},
  6.             transient, infinity, supervisor, [mod_xx]}) of
  7.         {ok, Pid} ->
  8.             timer:sleep(1000),
  9.             Pid;
  10.         _ ->
  11.             undefined
  12.     end.
根据,OTP设计文档中,启动策略有三类:
1、permanent  应用挂掉之后,其他所有的应用和运行中的系统跟着一起遭遇,都会挂
2、transient     应用收到normal终止信号时,其他应用和运行中的系统不熟影响,收到shutdown终止信号时,效果就和permanent一样了。由于,监督树的终止信号shutdown,所以,启动监督树的时候通常不用这个参数。
3、temporary  独立,该应用的死活不会影响到其他应用和runtine-time system

根据这些规则,将上面的应用启动改成:

点击(此处)折叠或打开

  1. start_xxapp() ->
  2.     case supervisor:start_child(
  3.          game_server_sup,
  4.          {mod_xx,
  5.          {mod_xx, start_link,[]},
  6.             temporary, 2000, supervisor, [mod_xx]}) of
  7.         {ok, Pid} ->
  8.             timer:sleep(1000),
  9.             Pid;
  10.         _ ->
  11.             undefined
  12.     end.
这样,就算是该应用挂掉,该节点和该节点上的其他应用不熟影响,更符合OTP的理念:容错。


上一篇:Erlang Record (记录)数据结构介绍
下一篇:一个由Erlang开发的Ftp客户端实例