Подписчики в Docker, использующие Redis и MedusaJs

У меня возникла проблема с настройкой подписчика в серверной части Medusa при запуске приложения в Docker. Я создал файл docker-compose.yml, который позволяет развертывать и использовать medusa_admin, мою собственную витрину и medusa_backend из docker. Также я создал свои базы данных в виде докер-контейнеров (redis, postgres и Solr для поисковой оптимизации).

Ниже приведен мой файл docker-compose.yml:

При запуске medusa_backend в режиме разработки черезnpm run startЯ могу использовать своего подписчика, и он вызывает функцию по назначению. Примечание. остальная часть приложения (интерфейс администратора, базы данных) работает в докере.

Я слушаю событие"product.updated"и он дает следующий ответ при запуске серверной части в режиме разработки:

информация: Обработка product.updated, у которого 1 подписчик

Когда мой бэкэнд Medusa (и остальная часть приложения) запускается через файл docker-compose.yml с помощью «docker-compose up --build -d» и пытается вызвать событие, я получаю следующий ответ:

информация: обработка product.updated, у которого 0 подписчиков.

Сначала я думал, что мои докер-контейнеры не могут подключиться друг к другу, но из командной строки моего внутреннего докер-контейнера я могу перейти на сервер Redis через «redis-cli -u $REDIS_URL» и выполнить команду «ping». Это означает, что контейнер Medusa_backend может успешно подключиться с помощью$REDIS_URLпеременная env, определенная в моемdocker-compose.yml.

Большая разница между работой в режиме разработки (запуск npm) и в Docker заключается в том, что URL-адреса моих Postgres, Redis и Solr заменяются на имена их контейнеров вместо localhost, чтобы Docker мог перенаправляться на правильный IP-адрес.

Обновление. При запуске того же образа Redis в докере, но не как части сети, мой бэкэнд может подключиться к нему через localhost:6379.

Обновление 2. Оказывается, как только я запускаю medusa_backend в качестве контейнера у себя, я не могу использовать своего подписчика. Думал, что это сработает при запуске образа с сервером Redis вне сети докера (через локальный хост). Это не так. В журналах medusa_backend я вижу:

      info:    Processing product.updated which has 0 subscribers

Я действительно не понимаю, почему, но буду продолжать разбираться в этом. Я предполагаю, что это должно быть что-то с подключением к базе данных Redis. Также я добавил в свой файл docker-compose проверку, которая проверяет, что мой Redis работает, прежде чем запускать мой сервер Medusa_backend.

Обновление 3. Я попытался консольно зарегистрировать мой EventBusService внутри конструктора моих подписчиков. Запуская Medusa_backend локально (через npm start), он регистрирует полный объект шины событий с параметрами подключения в моем экземпляре Redis. При выполнении в среде докера шина событий не регистрируется, что заставляет меня задаться вопросом, инициализируется ли вообще шина событий.

Есть ли какой-либо известный способ обеспечить инициализацию EventBusService при запуске серверной части?

1 ответ

РЕШЕНИЕ

Я нашел решение своей проблемы.

Когда я понял, что подписчик (а также eventBusService и т. д.) никогда не инициализировались, позвольте мне задуматься о том, что мой проект неправильно обрабатывает мои файлы TS.

Оказывается, мой подписчик и сервис, написанные на TS, не были транспилированы/скомпилированы должным образом.

Затем я заглянул в MedusaJS и TypeScript и нашел PR, в котором добавлена ​​поддержка TS.

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

я обновил свойpackage.jsonфайл со сценарием сборки:

      "scripts": {
"build": "tsc -p tsconfig.json",
"start": "npm run build && medusa develop"
},

Я добавил следующее в свойtsconfig.json

      {
  "compilerOptions": {
    "experimentalDecorators": true,
  },
  "extends": "./tsconfig.base.json",
  "include": ["src"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}

Я добавилtsconfig.base.jsonфайл

      {
    "compilerOptions": {
      "lib": ["es5", "es6"],
      "target": "esnext",
      "allowJs": true,
      "esModuleInterop": false,
      "module": "commonjs",
      "moduleResolution": "node",
      "emitDecoratorMetadata": true,
      "experimentalDecorators": true,
      "skipLibCheck": true,
      "skipDefaultLibCheck": true,
      "declaration": false,
      "sourceMap": false,
      "outDir": "./dist",
      "rootDir": "src",
      "baseUrl": "src"
    },
    "exclude": ["node_modules"]
  }

я обновил свой[develop.sh](http://develop.sh)скрипт для запуска тех же коммандос, что иnpm start script

      medusa migrations run

npm run build

medusa develop

Затем я запустил команды докера

docker-compose up --build -d

Бум . Журнал Medusa_backend показал, что подписчик был инициализирован и работал должным образом.

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