在Elixir上异常退出后,有没有办法重新启动具有不同配置的GenServer?

时间:2017-11-07 09:55:26

标签: elixir otp

我几天前开始学习Elixir,我真的很喜欢它。特别是使用Supervisor进程作为帮助程序来创建容错应用程序的想法。

但是,我认为一种情况很自然,但到目前为止我找不到任何引用,这是一种在失败时重新启动具有不同配置的子进程(GenServer)的方法。

我的用例如下:

我有一个进程可以从数据库中获取数据并在某种程度上使用它。数据库连接对于过程生命至关重要。 我希望能够使用不同的数据库连接(备份数据库),如果进程异常退出,因为它无法连接到数据库/从数据库获取数据给定N次(而不是释放地狱并抛出通知进程由于数据库连接而死了

有可能吗?

据我所见,Supervisor每次都以相同的方式重启过程。也许使用:simple_one_for_one策略可能就足够了,但我不确切知道如何。

1 个答案:

答案 0 :(得分:2)

AFAIK,使用单个选项是不可能的,因为需要存储此进程的状态(默认与备份。)

但是,实现所需的行为相对容易。

首先,让主管加载并维护连接池,例如: G。从配置文件。其次,是的,使用:simple_one_for_one重启策略更容易。 重要提示:让它明确捕获退出:

Process.flag :trap_exit, true

最后,当收到:EXIT信号时,旋转连接池,进行清理并使用start_link手动重启基础关键进程,并将当前头连接设置从连接池传递为它的论点。

一个hacky但更快的解决方案是将连接池存储在DETS(或任何其他持久存储)中,在初始化时读取它并传递给底层子节点,立即旋转并覆盖{{1}中的列表}}。这样,可以使用DETS或任何其他所需策略。应该清理每个管理程序重新启动时的存储,以使默认连接设置在此时位于顶部。我不推荐这种方法。

更新:显然,在您的特定情况下,只需使用长时间运行的Task并处理:one_for_one信号即可。

相关问题