gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:06:52 27 4
gpt4 key购买 nike

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

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

我的用例如下:

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

是否可以?

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

最佳答案

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

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

首先,让supervisor加载并维护连接池,e。 G。从配置文件。次要,不错,用起来更方便 :simple_one_for_one 重启策略。 重要提示:使其明确捕获导出:

Process.flag :trap_exit, true

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

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

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

关于elixir - 在 Elixir 异常退出后,有没有办法重新启动具有不同配置的 GenServer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com