OTP 平台的容错性高,是因为它提供了机制来监控所有 processes 的状态,如果有进程出现异常, 不仅可以及时检测到错误,还可以对 processes 进行重启等操作。
有了 supervisor,可以有效的提高系统的可用性,一个 supervior 监督一个或多个应用, 同时, supervior 也可以监督 supervior,从而形成一个监督树,提高整个系统的可用性。
注意 ,supervior 最好只用于监督,不要有其他的业务逻辑处理,越是接近监督树根部的 supervior 就要越简单, 因为 supervior 简单就不容易出错,它是保证系统高可用的关键。
下面,使用 elixir 中提供的 Supervisor 模块,构造简单的监督示例来演示如何提高系统的可用性。
监督策略有4种:
:one_for_one 只重启出错的 process
:one_for_all 当有 process 出错时,重启所有的 process
:rest_for_one 重启出错的 process ,以及所有在它之后启动的 process(也就是重启对出错 process 有依赖的 所有 process)
:simple_one_for_one 类似 :one_for_one ,但是 supervior 只能包含一个 process
监督策略的转换非常简单,下面演示2种监督策略的示例:
测试方式:
我们换一种监督策略试试看,只需要将上面的代码
改成
测试步骤 和 one_for_one 一样:
监督者并不是一维的,监督者也可以监督其它监督者,从而形成树状的监督关系。
修改上面的测试代码如下:(只修改了 Supervisor 的部分)
测试流程如下:
通过监督树,我们可以给不同的 process 分组,然后让每个组有不同的监督策略。
有了监督机制,可以及时的把握所有 process 的状态,通过监督树,还可以加入不同恢复机制。 因此,用好 Supervisor 模块,可以极大提高系统的可用性。
本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/p/5564459.html,如需转载请自行联系原作者