Запуск нескольких скриптов node.js на Heroku

У меня есть несколько сценариев .js, есть ли способ запустить их одновременно в одном приложении Heroku?

Мой folder выглядит так:

**MAIN_FOLDER**
    Procfile
    script1.js
    script2.js
    script3.js
    script4.js
    script5.js
    script6.js
    script7.js
    script8.js
    script9.js

Мой Procfile:

worker: node script1.js
worker: node script2.js
...
worker: node script8.js
worker: node script9.js

И мой package.json:

 "scripts": {
    "script1": "node script1.js",
    "script2": "node script2.js",
    "script3": "node script3.js",
    "script4": "node script4.js",
    "script5": "node script5.js",
    "script6": "node script6.js",
    "script7": "node script7.js",
    "script8": "node script8.js",
    "script9": "node script9.js",
    "start": "npm-run-all --parallel script1 script2 script3 script4 script5 script6 script7 script8 script9"
  }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 656
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь есть несколько проблем. Прежде всего, хотите ли вы запускать каждый из сценариев узла на отдельном Heroku dyno или вам достаточно запускать сценарии узла параллельно на одном динамометрическом стенде?

Если вам достаточно одного dyno, я думаю, вам следует изменить свой Procfile, чтобы он читал:

worker: npm start

(Я предполагаю, что npm-run-all, который вы используете в своем сценарии «npm start», отображается в ваших зависимостях package.json, иначе это не сработает).

Кроме того, похоже, вам не нужен веб-дино в вашем приложении (т.е. вы не обрабатываете входящий трафик HTTP / S). Если это так, вам нужно явно указать масштабируйте формирование вашего приложения с чем-то вроде heroku scale web=0 worker=1.

Обратите внимание, что вы должны делать это только в том случае, если вам действительно нужно, чтобы ваш рабочий дино был постоянно включен. Однако, если все, что вам нужно, это чтобы ваши скрипты выполнили некоторую работу, а затем завершили работу, вам следует вместо этого использовать одноразовые стенды. В этом случае установите heroku scale вашего рабочего на 0, а затем вы можете запустить его как одноразовый дино из командной строки с помощью heroku run worker.

Однако, если вы хотите, чтобы сценарии узла выполнялись параллельно на разных экземплярах динамометрического стенда, то, прежде всего, вам нужно знать о Пределы масштабирования Dyno. Обратите внимание на то, что «приложения, использующие бесплатный тип дино ограничены максимум двумя одновременными запущенными дино», так что, похоже, это не позволяет вам запускать 9 дино параллельно со свободными дино. Вы можете получить немного больше бесплатных параллельных динамиков, используя одноразовые стенды, но все же этого недостаточно для запуска 9 одновременных сценариев узлов.

Если вы используете платные динамометрические станции, то один из способов сделать то, что вы хотите, - это изменить свой Procfile следующим образом:

worker1: node script1.js
worker2: node script2.js
...
worker8: node script8.js
worker9: node script9.js

Затем используйте heroku scale для масштабирования каждого из worker*Типы процессов до 1.

Обратите внимание, однако, что вы должны делать это ТОЛЬКО, если вам нужно, чтобы ваши сценарии 9 узлов были «всегда включены». Если вашим скриптам просто нужно поработать, а затем выйти, вам следует использовать вместо этого одноразовые стенды. В противном случае вы будете платить МНОГО неиспользованных ресурсов !! В этом случае вы можете использовать heroku scale для масштабирования всех типов процессов worker* до 0, а затем запустить свои 9 сценариев из командной строки для запуска на отдельных одноразовых динамометрических станциях параллельно с чем-то вроде:

heroku run worker1 &
heroku run worker2 &
...
heroku run worker9 &

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