gpt4 book ai didi

Elixir:如果服务器重新启动,如何保留 OTP 队列?

转载 作者:行者123 更新时间:2023-12-02 00:58:09 25 4
gpt4 key购买 nike

我正在使用 OTP 来管理事件队列:

defmodule ParrotApi.MatchingSupervisor do
use Supervisor

## Callbacks

def start_link() do
Supervisor.start_link(__MODULE__, [])
end

def init(_) do
children = [
worker(ParrotApi.MatchingServer, []), # TODO: State is gone if this crashes

# Supervise connections
supervisor(Registry, [:unique, :connection_registry]),
supervisor(ParrotApi.ConnectionSupervisor, []),
]

supervise(children, strategy: :one_for_one)
end
end

我的问题是,如果服务器重新启动,我的队列会发生什么?我需要它在重新启动后继续存在。据我所知,它存储在内存中,因此如果服务器重新启动,它就会被删除。

最佳答案

我创建了一个单独的代理来跟踪 GenServer 中的状态。 Agent 非常简单,使用 API 来更新状态,并根据请求获取状态。

我在 GenServer 中创建 reply(state, result)noreply(state) 函数,并在 handle_call 末尾调用它们、handle_casthandle_info 函数。

replyno_reply 函数将 state 放入 Agent 中,然后返回 {:no_reply, state}{:reply, result, state} 元组。我还在终止时更新了代理。

当服务器重新启动时,我检查是否重新启动,如果是,则在 genservers init 回调中从代理中提取状态。我只是查了一下代理。如果没有数据,我就知道是原始启动。

这里的想法是代理是一个非常简单的值存储。它非常简单并且不太可能失败。

不过,您应该小心使用这种方法。重新启动策略背后的想法是 GenServer 以初始状态重新启动。如果您的 GenServer 由于状态问题而重新启动,它可能会进入持续重新启动状态。

关于Elixir:如果服务器重新启动,如何保留 OTP 队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43511568/

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