【问题标题】:Is there a way to restart a GenServer with different configuration after a abnormal exit on Elixir?在 Elixir 异常退出后,有没有办法重新启动具有不同配置的 GenServer?
【发布时间】:2018-04-19 16:05:24
【问题描述】:

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

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

我的用例如下:

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

有可能吗?

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

【问题讨论】:

    标签: elixir erlang-otp


    【解决方案1】:

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

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

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

    Process.flag :trap_exit, true
    

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


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


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

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2022-07-15
      • 2011-08-23
      • 2015-09-12
      相关资源
      最近更新 更多