Потоковая передача из канала Redis через канал Phoenix

В настоящее время я пытаюсь заменить actioncable небольшим приложением Phoenix. Что мне нужно сделать, так это получить информацию из канала Redis и передать ее клиенту ember. Я пытался использовать Redis.PuSub и адаптер Phoenix Redis, но не смог полностью охватить функциональность, которая у нас есть в настоящее время.

Текущая функциональность работает так:

Наш сервер получает запрос от пользователя и записывает некоторые данные на канал Redis. Имя этого канала является комбинацией строки и ключа. Затем Ember клиент делает запрос к action-cable с тем же ключом. Action-cable затем передает зарегистрированную информацию с канала Redis с тем же именем. Мне нужно знать, как начать прослушивание канала Redis с заданным именем, когда пользователь делает запрос и непрерывно передает эту информацию клиенту. Мне удалось получить одно или другое, но не оба.

Я бьюсь головой об этом уже целый день, так что любая помощь вообще очень ценится.

ура

1 ответ

Решение

Поэтому, чтобы решить эту проблему, я сделал следующее.

Во-первых, я установил 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, которые помогли мне найти решение. Вы можете найти нить здесь.

Другие вопросы по тегам