在 elixir genstage 消费者中使用 redis 连接
use redis connection in elixir genstage consumer
我有一个 genstage 应用程序示例,在它的使用者中我需要使用与 redis 的连接。而且我不明白我需要如何将此连接传递给 handle_events。
如果我写:
defp connection do
{:ok, conn} = Redix.start_link(host: "0.0.0.0", port: 6379)
conn
end
然后每次在handle_events函数内部调用连接时,都会创建一个新的连接。
我该如何解决这个问题?
您可以将 conn
保留在 GenStage
消费者的 state
中(就像在 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
我有一个 genstage 应用程序示例,在它的使用者中我需要使用与 redis 的连接。而且我不明白我需要如何将此连接传递给 handle_events。
如果我写:
defp connection do
{:ok, conn} = Redix.start_link(host: "0.0.0.0", port: 6379)
conn
end
然后每次在handle_events函数内部调用连接时,都会创建一个新的连接。
我该如何解决这个问题?
您可以将 conn
保留在 GenStage
消费者的 state
中(就像在 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