Используйте соединение redis в Elixir Genstage.
У меня есть пример приложения genstage, и в его потребителях мне нужно использовать соединение с Redis. И я не понимаю, как мне нужно передать это соединение handle_events.
Если я напишу:
defp connection do
{:ok, conn} = Redix.start_link(host: "0.0.0.0", port: 6379)
conn
end
Затем каждый раз, когда соединение вызывается внутри функции handle_events, оно создает новое соединение.
Как я могу решить эту проблему?
1 ответ
Решение
Вы можете сохранить conn
в state
из GenStage
потребитель (так же, как вы бы в GenServer
, что-то вроде этого:
defmodule C do
use GenStage
def start_link() do
GenStage.start_link(C, :ok)
end
def init(:ok) do
{:ok, conn} = Redis.start_link(...)
{:consumer, conn}
end
def handle_events(events, _from, conn) do
Redix.command!(conn, ...)
{:noreply, [], conn}
end
end
Здесь я создаю соединение, когда создается потребитель. Вы также можете создать соединение выше и передать его этому, если хотите, например:
defmodule C do
use GenStage
def start_link(conn) do
GenStage.start_link(C, conn)
end
def init(conn) do
{:consumer, conn}
end
def handle_events(events, _from, conn) do
Redix.command!(conn, ...)
{:noreply, [], conn}
end
end