在Elixir上异常退出后,有没有办法用不同的配置重新启动GenServer?
几天前我开始学习长生不老药,我真的很喜欢它。尤其是使用主管进程作为助手来创建容错应用程序的想法 然而,有一种我认为很自然但到目前为止我找不到任何参考的情况,那就是在发生故障时用不同的配置重新启动子进程(GenServer) 我的用例如下所示: 我有一个从数据库中获取数据并在某种程度上使用它的过程。数据库连接对于进程生命周期至关重要。 如果进程异常退出,我希望能够使用不同的数据库连接(备份数据库),因为它无法连接到数据库或从数据库获取数据给定N次(而不是释放地狱并抛出进程因数据库连接而死亡的通知) 可能吗在Elixir上异常退出后,有没有办法用不同的配置重新启动GenServer?,elixir,otp,Elixir,Otp,几天前我开始学习长生不老药,我真的很喜欢它。尤其是使用主管进程作为助手来创建容错应用程序的想法 然而,有一种我认为很自然但到目前为止我找不到任何参考的情况,那就是在发生故障时用不同的配置重新启动子进程(GenServer) 我的用例如下所示: 我有一个从数据库中获取数据并在某种程度上使用它的过程。数据库连接对于进程生命周期至关重要。 如果进程异常退出,我希望能够使用不同的数据库连接(备份数据库),因为它无法连接到数据库或从数据库获取数据给定N次(而不是释放地狱并抛出进程因数据库连接而死亡的通知)
就我所见,主管每次都以相同的方式重新启动流程。也许用一个
:简单的“一对一”策略就足够了,但我不知道具体怎么做 AFAIK,使用单个选项是不可能的,因为需要存储此进程的状态(默认与备份)
不过,实现所需的行为相对容易
首先,让主管加载并维护连接池,例如。G从配置文件。其次,是的,使用重启策略更容易重要提示:使其显式捕获出口:
Process.flag :trap_exit, true
最后,当收到:EXIT
信号时,旋转连接池,进行清理,并使用start\u link
手动重新启动底层关键进程,将连接池中当前的头连接设置作为参数传递给它
一个简单但更快的解决方案是将连接池存储在DETS
(或任何其他持久性存储)中,在初始化时读取它并传递给底层子级,立即旋转并覆盖DETS
中的列表。这样人们就可以使用:一对一
或任何其他想要的策略。应该在每次重新启动监控器时清理存储,以使默认连接设置此时处于顶部。我不推荐这种方法
更新:显然,在您的特定情况下,仅使用长时间运行并处理来自它的:DOWN
信号就足够了