Elixir:如果服务器重新启动,如何保留 OTP 队列?
Elixir: How to persist OTP queue if server restarts?
我正在使用 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_cast
和 handle_info
函数的末尾调用它们。
reply
和 no_reply
函数将 state
放入代理中,然后 return {:no_reply, state}
和 {:reply, result, state}
元组。我还在终止时更新代理。
当服务器重新启动时,我检查它是否重新启动,如果是,则从 genservers init
回调中的代理拉取状态。我只是检查代理。如果没有数据,我知道是原始启动。
这里的想法是代理是一个非常简单的值存储。它非常简单,不太可能失败。
尽管如此,您应该谨慎使用这种方法。重启策略背后的想法是 GenServer 以其初始状态重启。如果您的 GenServer 由于其状态问题而重新启动,它可能会进入持续重新启动状态。
你说得对,如果服务器重启,它会被擦除,如果你所说的服务器是指整台机器,而不仅仅是 genserver。我建议将队列存储在数据库或 Redis 等持久存储中。
我正在使用 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_cast
和 handle_info
函数的末尾调用它们。
reply
和 no_reply
函数将 state
放入代理中,然后 return {:no_reply, state}
和 {:reply, result, state}
元组。我还在终止时更新代理。
当服务器重新启动时,我检查它是否重新启动,如果是,则从 genservers init
回调中的代理拉取状态。我只是检查代理。如果没有数据,我知道是原始启动。
这里的想法是代理是一个非常简单的值存储。它非常简单,不太可能失败。
尽管如此,您应该谨慎使用这种方法。重启策略背后的想法是 GenServer 以其初始状态重启。如果您的 GenServer 由于其状态问题而重新启动,它可能会进入持续重新启动状态。
你说得对,如果服务器重启,它会被擦除,如果你所说的服务器是指整台机器,而不仅仅是 genserver。我建议将队列存储在数据库或 Redis 等持久存储中。