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