【问题标题】:Will data in gen_server be kept after restarted by its supervisor?gen_server 中的数据在其主管重新启动后是否会保留?
【发布时间】:2011-10-16 09:38:10
【问题描述】:

我有一个启动许多 gen_server 的主管。每个 gen_server 都有大量的数据负载,这需要很多时间。我想知道什么时候发生错误,gen_server 的 state 中存储的数据和它的 process dict 是否会被保留以备下次启动,这样我就不需要再次初始化它们了?

【问题讨论】:

  • 您可能还想阅读this。它讨论了不同类型的状态并提出了解决问题的方法。

标签: erlang erlang-otp


【解决方案1】:

如果您的应用程序中有任何数据需要持久化应用程序崩溃,那么您需要将其从应用程序中分离到数据库(Mnesia)或ETS/DETS tables。让 gen_server 状态包含 live/temporary/transient 信息,它只允许它快速操纵应用程序的瞬态状态。
一旦你的 gen_server init/1 被调用,让它读取配置文件或数据库以获得开始状态。通常,当您的应用程序非常依赖服务器的最后一个状态时,每次有请求进入并操纵 gen_server 状态时,您都会从中提取信息并将其复制到持久存储中(并将此数据标记为先前的已知状态)。这使您的 init/1 函数始终检查上一个/上一个状态,或者它是否应该开始一个新状态。

【讨论】:

    【解决方案2】:

    Erlang 行为的当前状态不会保存在任何地方。您必须自己处理。

    您要么在外部某处定期保存状态(在另一个进程中、在 ETS 表、数据库等中),要么确保您的 init/1 函数足够智能和动态,能够在启动时重新创建状态(恢复现有文件,根据原始输入参数重新创建一些缓存等)

    基本上,您必须定义哪些数据应该在崩溃中幸存下来,以及如何保留或重新创建它。

    【讨论】:

    • 我唯一要补充的是:避免使用进程字典,尤其是存储大量状态。最好是根本不用它
    • @Peer:特别是因为它不保留任何数据,就像属于进程内存的所有其他内容一样。
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2016-01-13
    • 2012-04-04
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多