Используйте соединение 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
Другие вопросы по тегам