Использование Redix или Exredis для тестирования сервера Redis - PullRequest
0 голосов
/ 30 мая 2018

Это немного странный вопрос.Мы пишем приложение elixir, которое будет тестировать различные части инфраструктуры различных приложений.

По сути, я хочу, но не смог, имитировать ошибку подключения Redis и иметь возможность восстановиться после этой ошибки.Поскольку Redix и Exredis, похоже, выдают ошибки из нового pid-соединения, я не могу ничего сделать.

Пример того, что нам, по сути, нужно:

def is_redis_down() do
      {:ok, conn} = Redix.start_link("redis://wrong", name: :redix) 
          case Redix.command(conn, ["ping"]) do
              {:ok, response} ->
                  Redix.stop(conn)
                  response !== "PONG"
              {:error, _ } ->       
                  GenServer.stop(conn, :normal)
                  true
          end
    end

Проблема в том, что если вы оставляете строку подключения неправильной, start_link возвращает Pid, ​​но оператор case никогда не запускается.Это как start_link разбивает родительский pid.Любые идеи о том, как восстановить?Я просто хочу true, если он подключается и отправляет пинг, или false, если он не может подключиться.

Я пытался вложить в задачу и отдельный pid.

1 Ответ

0 голосов
/ 30 мая 2018

Redix имеет опцию sync_connect.Если вы установите значение true, функция вернет после , когда связь будет установлена, или произойдет сбой, если произошла ошибка.Вы можете использовать Process.flag(:trap_exit, true) для перехвата выходных сообщений, чтобы предотвратить сбой вашего родительского процесса.После этого вам просто нужно проверить {:ok, conn} и {:error, error}:

defmodule A do
  def is_redis_down() do
    Process.flag(:trap_exit, true)
    case Redix.start_link("redis://wrong", sync_connect: true) do
      {:ok, _} -> true
      {:error, _} -> false
    end
  end
end

IO.inspect A.is_redis_down()

Если вы не хотите изменять trap_exit родительского процесса, вы можете создать несвязанный Task и сделайте это вычисление в этом.

...