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

Is there a way to restart a GenServer with different configuration after a abnormal exit on Elixir?

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

然而,我认为很自然但到目前为止我找不到任何参考的一个方案是一种在失败时使用不同配置重新启动子进程 (GenServer) 的方法。

我的用例如下:

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

可能吗?

据我所知,Supervisor 每次都以相同的方式重新启动进程。也许使用 :simple_one_for_one 策略在某种程度上就足够了,但我不知道具体如何。

据我所知,这对于单个选项是不可能的,因为需要存储此进程的状态(默认与备份。)

不过,实现所需的行为相对容易。

首先让supervisor加载和维护连接池,e。 G。从配置文件。其次,是的,使用:simple_one_for_one重启策略更容易。 重要: 让它明确地捕获出口:

Process.flag :trap_exit, true

最后,当收到 :EXIT 信号时,旋转连接池,进行清理并使用 start_link 手动重启底层关键进程,从连接传递当前的头连接设置pool 作为它的参数。


一个 hacky 但更快的解决方案是将连接池存储在 DETS(或任何其他持久存储)中,在初始化时读取它并传递给底层子级,立即旋转并覆盖 DETS。这样一来,人们可能会使用 :one_for_one 或任何其他所需的策略。应该在每次主管重新启动时清理存储,以使默认连接设置在那一刻处于最前面。我不推荐这种方法。


更新: 显然,在您的特定情况下,仅使用 long-运行 Task 并处理来自它的 :DOWN 信号就足够了。