【问题标题】:use redis connection in elixir genstage consumer在 elixir genstage 消费者中使用 redis 连接
【发布时间】:2017-10-07 18:57:22
【问题描述】:

我有一个 genstage 应用程序示例,在它的消费者中我需要使用与 redis 的连接。而且我不明白我需要如何将此连接传递给 handle_events。

如果我写:

  defp connection do
    {:ok, conn} = Redix.start_link(host: "0.0.0.0", port: 6379)
    conn
  end

那么每次在handle_events函数内部调用连接时,都会创建一个新的连接。

我该如何解决这个问题?

【问题讨论】:

    标签: elixir genstage


    【解决方案1】:

    您可以将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
    

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 2021-03-06
      • 1970-01-01
      • 2019-01-11
      • 2019-03-14
      • 1970-01-01
      • 2017-07-01
      • 2019-01-10
      • 2021-01-06
      相关资源
      最近更新 更多