Как подключить API на node.js к экземпляру RabbitMQ на Fly.io?

Вопрос или проблема

Смотрите также: JavascriptNode.jsRabbitMQ Я работаю над проектом, который пытаюсь подключить к брокеру RabbitMQ, который я настроил на fly.io с API на Node.js, но не могу понять, как это сделать.

Что я пробовал:

Я пробовал различные способы переписывания URL для соединения amqp, но ни один из них не сработал. Вот моя переменная окружения URL RabbitMQ в моем API на Node.js:

#----Переменные зависимости сервиса----
RABIT_MQ_URL=amqp://rabbit-mq-fly-dep.fly.dev:5672
#----Переменные зависимости сервиса----

Я также пробовал этот формат:

#----Переменные зависимости сервиса----
RABIT_MQ_URL=amqp://USERNAME:[email protected]:5672/VHOST_NAME
#----Переменные зависимости сервиса----

Однако ошибка, которую я получил в моем приложении на Node.js, не изменилась:

ERR {
  success: false,
  message: Error: getaddrinfo ENOTFOUND rabbit-mq-fly-dep.fly.dev
      at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:120:26) {
    errno: -3008,
    code: 'ENOTFOUND',
    syscall: 'getaddrinfo',
    hostname: 'rabbit-mq-fly-dep.fly.dev'
  }
}

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

#---Переменные зависимости сервиса----
RABIT_MQ_URL=amqp://localhost
#----Переменные зависимости сервиса----

Это работает каждый раз, если я запускаю экземпляр RabbitMQ локально, конечно.

Также следует отметить, что я пытался добавить IP-адрес к развертыванию на fly.io и изменил URL, чтобы использовать amqps вместо протокола amqp в переменных окружения API на Node.js, поскольку экземпляр RabbitMQ настроен на использование TLS, но все равно получил ту же ошибку подключения. Вот формат данной реализации в переменных API на Node.js:

#----Переменные зависимости сервиса----
RABIT_MQ_URL=amqps://USERNAME:PASSWORD@IPV6ADDRESS:5672/emailer
#----Переменные зависимости сервиса----

Я не знаю, почему это не работает.

Вот мой Docker файл для экземпляра RabbitMQ на fly.io:

FROM rabbitmq:3-management-alpine
COPY ./prod.conf /etc/rabbitmq/rabbitmq.conf
RUN rabbitmq-plugins enable rabbitmq_management

И мой файл toml для fly.io:

# fly.toml конфигурационный файл приложения, сгенерированный для rabbit-mq-fly-dep 2024-09-25T14:16:38-04:00
#
# Смотрите https://fly.io/docs/reference/configuration/ для информации о том, как использовать этот файл.
#

app = 'rabbit-mq-fly-dep'
primary_region = 'mia'

[build]

[[services]]
  protocol = "tcp"
  internal_port = 5672

  [[services.tcp_checks]]
    interval = "15s"
    timeout = "1m0s"
    grace_period = "1s"

  [[services.ports]]
    port = 5673
    handlers = ["tls"]

[[services]]
  protocol = "tcp"
  internal_port = 15672

  [[services.ports]]
    port = 15672
    handlers = ["tls", "http"]

  [[services.tcp_checks]]
    interval = "15s"
    timeout = "1m0s"
    grace_period = "1s"

А вот файл .config экземпляра RabbitMQ:

listeners.tcp.default=5672
default_user=admin
default_pass=admin
management.tcp.ip=::

Буду признателен за любую помощь по этому вопросу. Спасибо!

Ответ или решение

Для соединения вашего Node.js API с экземпляром RabbitMQ на Fly.io, необходимо следовать нескольким шагам. Давайте разберем все аспекты вашего вопроса и решим проблему, с которой вы сталкиваетесь.

Шаг 1: Проверьте конфигурацию RabbitMQ

Судя по вашему fly.toml файлу и конфигурации RabbitMQ, у вас есть несколько параметров, которые требуют внимания. Ваша конфигурация должна обеспечивать доступ к RabbitMQ как для AMQP, так и для управления через HTTP.

  • Убедитесь, что ваши порты правильно настроены. Вы используете порты 5672 для AMQP и 15672 для управления. Это правильный подход, однако проверьте, что у вас не заблокированы порты на уровне брандмауэра или в самой настройке Fly.io.
  • В конфигурации RabbitMQ (prod.conf), вы можете добавить следующее для повышения безопасности:
listeners.tcp.default = 5672
default_user = admin
default_pass = admin
management.listener.port = 15672

Шаг 2: Обновление окружения в Node.js API

Теперь вам нужно убедиться, что вы правильно формируете URL подключения. Стандартный формат для AMQP выглядит следующим образом:

amqp://USERNAME:PASSWORD@rabbit-mq-fly-dep.fly.dev:5672

Если вы используете TLS, то вам нужно будет использовать amqps. Убедитесь, что RabbitMQ настроен на использование TLS и у вас есть правильные сертификаты, если это необходимо.

Ваша переменная окружения RABIT_MQ_URL должна выглядеть так:

RABIT_MQ_URL=amqps://admin:admin@rabbit-mq-fly-dep.fly.dev:5672

Обратите внимание на корректные учетные данные и DNS имя из вашего Fly.io.

Шаг 3: Проверка DNS

Ошибка ENOTFOUND говорит о том, что DNS не может разрешить имя хоста. Убедитесь, что экземпляр RabbitMQ запущен и доступен. Попробуйте выполнить команду:

ping rabbit-mq-fly-dep.fly.dev

Если он не отвечает, возможно, ваш экземпляр RabbitMQ не запущен или неправильно настроен.

Шаг 4: Обработка подключения в Node.js

Убедитесь, что ваше соединение с RabbitMQ обернуто в обработку ошибок. Пример кода:

const amqp = require('amqplib');

async function connect() {
    try {
        const connection = await amqp.connect(process.env.RABIT_MQ_URL);
        console.log("Успешное соединение с RabbitMQ");

        // Дальнейшая работа с соединением
    } catch (error) {
        console.error("Ошибка соединения с RabbitMQ:", error);
    }
}

connect();

Если соединение не устанавливается, проверьте вывод ошибок для получения дополнительной информации.

Шаг 5: Диагностика

Если проблема все еще остается, выполните следующие диагностические шаги:

  1. Запустите экземпляр RabbitMQ локально вне Fly.io и попытайтесь подключиться к нему с вашего API.
  2. Проверьте логи RabbitMQ на Fly.io через интерфейс управления или команду Fly.
  3. Подтвердите, что ваша Node.js среда имеет доступ к интернету и может выполнять DNS-запросы.

Заключение

Ваша проблема, скорее всего, связана с конфигурацией и DNS разрешением. Проверьте, правильно ли вы настроили URL соединения, а также убедитесь, что ваш экземпляр RabbitMQ доступен по сети. Если все указанные шаги не помогут, рассмотрите возможность обращения в поддержку Fly.io для получения дополнительной помощи.

Оцените материал
Добавить комментарий

Капча загружается...