Node redis Выпуск ETIMEOUT - PullRequest
       6

Node redis Выпуск ETIMEOUT

0 голосов
/ 13 февраля 2020

Я давно использую node-redis и пока все хорошо. Однако после настройки новой среды у меня была опечатка на имя хоста (или пароль), и он не мог подключиться. Но поскольку это было уже работающее приложение, которое я когда-то разработал go, было довольно сложно отследить реальную проблему. Когда вы выполняете запросы к этому серверу, он просто берет тайм-аут сервера, который составляет 5 минут, и возвращается с ошибкой 500.

В конце я обнаружил, что это были учетные данные для сервера redis. Я использую Redis для ускорения работы моего приложения, предотвращая повторную проверку токенов безопасности в течение часа (поскольку процесс проверки может занять до 2000 мс), поэтому я сохраняю токен в Redis для будущих запросов.

Это сработало Впрочем, это было хорошо в течение многих лет, просто потому, что на этот раз у меня была опечатка с именем хоста или паролем, я заметил, что, если сервер redis не может подключиться (по любой причине), все приложение выходит из строя. Идея состоит в том, что следует использовать redis, если он доступен, если нет, то он должен использовать запасной вариант, чтобы просто взять длинный маршрут, но в любом случае выполнить запрос.

Поэтому мой вопрос заключается в том, как заставить узел-redis выдавать ошибку как как можно скорее, а не ждать появления ошибки ETIMEOUT?

Например:

const client = redis.createClient(6380, "redis.host.com", { password: "verystrongone" } });
client.on("error", err => {
    console.log(err)
})

На основе этого кода я получаю сообщение об ошибке console.log ПОСЛЕ того, как истечет время ожидания (около 30- 40 секунд). Это не хорошо, потому что тогда мое приложение по крайней мере 30 секунд не отвечает. Чего я хочу добиться, так это того, что если redis не работает или что-то еще, он должен просто сдаться через 2-5 секунд. Я использую очень быстрый и надежный сервер redis с Azure. Для подключения требуется менее секунды, и я никогда не отказывал, я полагаю, что если это произойдет, то для этого потребуется целое приложение.

Я пробовал что-то вроде retry_strategy, но я считаю, что этот параметр срабатывает только после первоначальной попытки ~ 30 секунд.

Есть предложения?

1 Ответ

0 голосов
/ 13 февраля 2020

Итак, вот интересная вещь, которую я заметил.

Когда я подключаюсь к экземпляру Redis-кеша, используя следующие параметры, я могу воспроизвести ошибку, которую вы получаете.

    port: 6380,
    host: myaccount.redis.cache.windows.net,
    auth_pass: mysupersecretaccountkey

Когда я указываю неверный пароль, я получаю ошибку через 1 минуту.

Однако, если я укажу параметр tls, я получаю ошибку почти мгновенно:

    port: 6380,
    host: myaccount.redis.cache.windows.net,
    auth_pass: mysupersecretaccountkey,
    tls: {
      servername: myaccount.redis.cache.windows.net
    }

Можете ли вы попробовать с опцией tls?

Я все еще не могу воспроизвести ошибку, если я укажу неправильное имя учетной записи. Я получаю следующую ошибку почти мгновенно:

Переадресация соединения с myincorrectaccountname.redis.cache. windows. net: 6380 не удалось - getaddrinfo ENOTFOUND myincorrectaccountname.redis.cache. windows. net

...