【问题标题】:Streaming from a redis channel through a phoenix channel通过 phoenix 通道从 redis 通道流式传输
【发布时间】:2017-02-13 23:07:35
【问题描述】:

我目前正在尝试用一个小凤凰应用程序替换。我需要做的是从 频道获取信息并将其流式传输到 客户端。我一直在尝试使用 Redis.PuSub 和 Phoenix Redis 适配器,但无法完全涵盖我们目前拥有的功能。

目前的功能是这样工作的:

我们的服务器接收来自用户的请求并将一些输出记录到 Redis 通道。 该频道的名称是字符串和键的组合。 然后 Ember 客户端使用相同的密钥向 action-cable 发出请求。 然后 Action-cable 从 Redis 通道以相同的名称流式传输记录的信息。 我需要知道的是,当用户发出请求并将该信息连续流式传输到客户端时,如何开始收听具有给定名称的 Redis 通道。我设法得到了一个或另一个,但不是两者兼而有之。

我已经为此纠结了一天多,因此非常感谢任何帮助。

干杯

【问题讨论】:

  • 首先,你需要Redis吗?也就是说,这一切都发生在同一台服务器上吗?
  • Redis 仍在用于其他两项服​​务,其中一项是用于通信和共享数据的 rails 应用程序。所以目前它几乎是一个要求

标签: actioncable redis ember redis elixir phoenix-framework phoenix-channels


【解决方案1】:

所以为了解决这个问题,我做了以下事情。

首先,我根据docs 将 Redix.PubSub 设置为依赖项。然后在我做的频道中:

defmodule MyApp.ChannelName do
  use Phoenix.Channel

  def join(stream_name, _message, socket) do
    # Open a link to the redis server
    {:ok, pubsub} = Redix.PubSub.start_link()

    # Subscribe to the users stream
    Redix.PubSub.subscribe(pubsub, stream_name, self())

    {:ok, socket}
  end

  # Avoid throwing an error when a subscribed message enters the channel
  def handle_info({:redix_pubsub, redix_pid, :subscribed, _}, socket) do
    {:noreply, socket}
  end

  # Handle the message coming from the Redis PubSub channel
  def handle_info({:redix_pubsub, redix_pid, :message, %{channel: channel, payload: message}}, socket) do
    # Push the message back to the user
    push socket, "#{channel}", %{message: message}
    {:noreply, socket}
  end
end

在我的例子中,我要求用户使用某个名称注册一个频道,例如channel_my_api_key。然后,我将开始在 redis 频道 channel_my_api_key 上收听,并通过 push 函数将信息流回给用户。注意广播可以代替推送。

感谢 Elixir 论坛的 Alex Garibay 帮助我找到了解决方案。你可以找到线程here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多