Выполнение заданий до того, как сервер heroku nodejs будет готов - PullRequest
6 голосов
/ 06 июня 2019

При развертывании нового выпуска я хотел бы, чтобы мой сервер выполнил некоторые задачи перед его выпуском и прослушивал http-запросы.

Скажем, эти задачи занимают около минуты и устанавливают некоторые переменные: пока задачи не будут выполнены, я бы хотел, чтобы пользователи перенаправлялись на старую версию.

В основном некоторые nodejs работают до того, как сервер готов.

Я попробовал наивный подход:

doSomeTasks().then(() => {
  app.listen(PORT);
})

Но как только выходит новая версия, все запросы https во время выполнения задач не работают, вместо того, чтобы перенаправлять на старый выпуск.

Я прочитал https://devcenter.heroku.com/articles/release-phase, но похоже, что я могу запускать только внешний скрипт, который мне не подходит, так как мои задачи устанавливают переменные кэша.

Я знаю, что это возможно с / check_readiness в App Engine, но мне было интересно, что такое Heroku.

Ответы [ 2 ]

4 голосов
/ 16 июня 2019

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

//script file 
var client = require('cache_client');
// and here you can require all the needed libarires to the script 
// then execute your logic using sync apis 
client.setCacheVar('xyz','xyz');

затем в packege.json в "скриптах" добавьте этот скрипт, давайте предположим, что вы назвали его set_cache

    "scripts": {
    "set_cache": "set_cache",
  },

теперь вы можете использовать npm для запуска этого скрипта как npm set_cache и использовать эту команду в Procfile

web: npm start 
release: npm set_cache 
3 голосов
/ 19 июня 2019

У вас есть пара вариантов.

  1. Если работа, которую вы выполняете, изменяется только при выпуске, вы можете добавить задачу на этапе сборки dyno, которая будет извлекать и хранить данные в скомпилированном слаге, который будет развернут в виртуальных контейнерах на Heroku. и загрузился как твой динам. Например, в цикле сборки можно запустить задачу, которая извлекает данные и сохраняет / кэширует их в виде файла в приложении, которое вы читаете при загрузке.

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

    Это отличный вариант, если вам необходимо, например, предварительно кэшировать больший кусок данных, а затем извлекать только новые данные по запросу (например, извлекать последние 1000 сообщений в RSS-канале при загрузке) затем для каждого запроса извлекает что-либо более новое (что, вероятно, будет меньше, чем несколько новых записей) и объединяет данные для возврата клиенту).

Вот документация по настройке процесса сборки для Node.js в Heroku.

Вот документация по включению и работе с Preboot на Heroku

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...